Page 1 of 1

increase aplication speed

Posted: Sat Aug 13, 2011 10:27 am
by fafi
Hi All

To test : call it every where..

Waiting for feed back..

Thanks
Best Regards
Fafi

Code: Select all

FUNCTION MemoryFlush() 
    
local nResult
local MemorySize := 1024*1024*1024
    
if nResult := SetProcess( GetCurrentProcess(), MemorySize, MemorySize*2 )   <= 0
     MemorySize := 512*1024*1024
     if nResult := SetProcess( GetCurrentProcess(), MemorySize, MemorySize*2 )  <= 0    
         MemorySize := 64*1024*1024
         if nResult := SetProcess( GetCurrentProcess(), MemorySize, MemorySize*2 )  <= 0
              MemorySize := 32*1024*1024
              if nResult := SetProcess( GetCurrentProcess(), MemorySize, MemorySize*2 ) <= 0
                 nResult := SetProcess( GetCurrentProcess(), -1, -1 )   <= 0
              endif     
         endif  
     endif
endif   

SysRefresh()
    
RETURN nResult

DLL32 Function SetProcess( ;
   hWnd As LONG, nMinWorkingSpace As LONG, nMaxWorkingSpace As LONG ) ;
   As LONG PASCAL From "SetProcessWorkingSetSize" Lib "Kernel32.dll"

DLL32 Function GetCurrentProcess() ;
   As LONG PASCAL From "GetCurrentProcess" Lib "Kernel32.dll"
 

Re: increase aplication speed

Posted: Sat Aug 13, 2011 7:00 pm
by MarcoBoschi

Code: Select all

#include "fivewin.ch"
ANNOUNCE RDDSYS

FUNCTION MAIN()
LOCAL nInizio := SECONDS()
LOCAL nConta := 0
USE deb
GO TOP

DO WHILE !EOF()
   memoryflush()
   SKIP
   nConta ++
ENDDO

? SECONDS() - nInizio   , nConta

RETURN NIL

INIT PROCEDURE RddInit
REQUEST DBFFPT
REQUEST DBFCDX
rddSetDefault( "DBFCDX" )


FUNCTION MemoryFlush()

local nResult
local MemorySize := 1024*1024*1024

if nResult := SetProcess( GetCurrentProcess(), MemorySize, MemorySize*2 )   <= 0
     MemorySize := 512*1024*1024
     if nResult := SetProcess( GetCurrentProcess(), MemorySize, MemorySize*2 )  <= 0
         MemorySize := 64*1024*1024
         if nResult := SetProcess( GetCurrentProcess(), MemorySize, MemorySize*2 )  <= 0
              MemorySize := 32*1024*1024
              if nResult := SetProcess( GetCurrentProcess(), MemorySize, MemorySize*2 ) <= 0
                 nResult := SetProcess( GetCurrentProcess(), -1, -1 )   <= 0
              endif
         endif
     endif
endif

SysRefresh()

RETURN nResult

DLL32 Function SetProcess( ;
   hWnd As LONG, nMinWorkingSpace As LONG, nMaxWorkingSpace As LONG ) ;
   As LONG PASCAL From "SetProcessWorkingSetSize" Lib "Kernel32.dll"

DLL32 Function GetCurrentProcess() ;
   As LONG PASCAL From "GetCurrentProcess" Lib "Kernel32.dll"
 
I do not see any differences
I also put this function in a big app after an ACTIVATE DIALOGbut I do not see difference at all!
Could you post a sample code to evaulate this?

King regards

marco

Re: increase aplication speed

Posted: Sat Aug 13, 2011 8:19 pm
by fafi
Mr. Marco, thanks for the test...

it's work when you have big size databases more than 50000 records

I'm sorry this my Indonesian language , look at the remarks

Code: Select all

function HitungStock()  // <-- final stock count for drug expiration dates
   
 local oDlgStock,nBanyak := obat->(lastrec()), nPos := 0
 
 MemoryFlush()
 

 define dialog oDlgStock from 1,1 to 40,350 pixel style nOR( WS_CAPTION ) title "Menghitung Kartu Stock"
 
 @ 2, 2 PROGRESS oPrg;
           SIZE 170, 15 of oDlgStock pixel
 
 activate dialog oDlgStock centered nowait
 
           nBanyak := edaw->(lastrec())
              
           oPrg:SetPos( 0 )   
           oPrg:SetRange( 0, nBanyak  )   
           edaw->(ordScope(0,nil))
           edaw->(ordScope(1,nil))      
           edaw->(dbGotop())
           
           do while !edaw->(eof())
              oPrg:SetPos( ++nPos )
              oPrg:Refresh()   
              if empty(edaw->tglawal)
                  edaw->(dbDelete())
              endif   
              edaw->(dbSkip())
           enddo
           
 
 nBanyak := obat->(lastrec())   
 oPrg:SetPos( 0 )

 oPrg:SetRange( 0, nBanyak  )  //  <--  nBanyak more than  50000 records 
       
 nPos := 0
    
 obat->(dbGotop())
 do while !obat->(eof())   // <--   more than  50000 records 
 
           MemoryFlush()
           SysRefresh()
                       
           oPrg:SetPos( ++nPos )
           oPrg:Refresh()   
              
           edaw->(ordScope(0,nil))
           edaw->(ordScope(1,nil))      
               
           edaw->(ordSetFocus("kode"))
            
           edaw->(ordScope(0,obat->kode))
           edaw->(ordScope(1,obat->kode))
           edaw->(dbGotop())
           
           dbSelectArea("fifom") 
           zap   
           
           dbSelectArea("fifok")
           zap   
           
           do while !edaw->(eof()) //  <--  more than  50000 records  <-- final stock count for drug expiration dates
              
                        if edaw->sts == "001" .or. edaw->sts == "002" .or. edaw->sts == "004"   // barang masuk
                            if !empty(edaw->tgled)
                               fifom->(dbAppend())
                               fifom->kode     := edaw->kode        
                               fifom->qty      := edaw->qty   
                               fifom->keluar   := 0
                               fifom->sisa     := edaw->qty
                               fifom->nama     := edaw->nama
                               fifom->satuan   := edaw->satuan
                               fifom->harga    := edaw->harga 
                               fifom->tgled    := edaw->tgled 
                               fifom->cnobat   := edaw->cnobat
                           endif
                        endif
                        
                        if edaw->sts == "003" .or. edaw->sts == "005"  // barang keluar
                            fifok->(dbAppend())
                            fifok->kode     := edaw->kode        
                            fifok->qty      := edaw->qty   
                            fifok->keluar   := edaw->keluar
                            fifok->sisa     := edaw->sisa  
                            fifok->harga    := edaw->harga 
                            fifok->tglawal  := edaw->tglawal
                       endif         
                     
              edaw->(dbSkip())
           enddo
           
           fifok->(dbGotop())
           do while !fifok->(eof())
              nQty := fifok->qty
              fifom->(dbGotop())
              do while !fifom->(eof())
           
                 if fifom->sisa >= nQty
                      fifom->keluar += nQty
                      fifom->sisa  := fifom->qty - fifom->keluar
                      exit
                 else
                      fifom->keluar += fifom->sisa
                      nQty -= fifom->sisa
                      fifom->sisa  := 0
                 endif   
                 fifom->(dbSkip())
              enddo            
              fifok->(dbSkip())
           enddo
           
           fifom->(dbGotop())
           do while !fifom->(eof())
              if fifom->sisa # 0
                  edsisa->(dbAppend())
                         edsisa->kode     := fifom->kode        
                         edsisa->qty      := fifom->qty   
                         edsisa->keluar   := fifom->keluar
                         edsisa->sisa     := fifom->sisa
                         edsisa->nama     := fifom->nama
                         edsisa->satuan   := fifom->satuan
                         edsisa->harga    := fifom->harga 
                         edsisa->jumlah   := fifom->harga * fifom->jumlah
                         edsisa->tgled    := fifom->tgled 
                         edsisa->cnobat   := fifom->cnobat
                               
                         obat->(ordSetFocus("kode"))
                         obat->(dbGotop())
                         if obat->(dbSeek(fifom->kode))
                            edsisa->kdjenis  := obat->kdjenis
                              edsisa->jenis    := obat->jenis   
                             edsisa->kdkel    := obat->kdkel
                            edsisa->ktkel    := obat->ktkel   
                 endif   
              endif   
              fifom->(dbSkip())
           enddo
           
           
 
          nAwal := nMasuk := nKeluar := 0  
          edaw->(dbGotop())
          do while !edaw->(eof())
             if edaw->sts == "001"
                 nAwal += edaw->qty
           endif   
           
             if edaw->sts == "002" .or. edaw->sts == "004"
                 nMasuk += edaw->qty
             endif   
           
           if edaw->sts == "003" .or. edaw->sts == "005"
                 nKeluar += edaw->qty
             endif   
             
             edaw->(dbSkip())
          enddo   
          
          if obat->(rlock())
             obat->awal   := nAwal
             obat->masuk  := nMasuk
             obat->keluar := nKeluar
             obat->sisa   := (nAwal + nMasuk) - nKeluar           
          endif   
          obat->(dbUnlock())
          obat->(dbSkip())
 
 enddo
 
 MemoryFlush()
 
 oDlgStock:End()
 
return nil
 
That's all
Regards
Fafi

Re: increase aplication speed

Posted: Mon Aug 15, 2011 5:09 pm
by MarcoBoschi
Ok i'll test it
marco

Re: increase aplication speed

Posted: Tue Aug 16, 2011 6:15 am
by Carles
fafi,

I think this code have a mistake. If u want increase speed u can't execute 50000 times refresh progress bar. I advise you to define progress bar up 100. Then u need create one var to control every time that u want refresh progress bar f.e

oPrg:SetRange( 0, 100 )
nEvery := Int( nBanyak / 100 )

Reset a counter

nLapsus := 0

And finally into loop to control it.

while ....

nLapsus++

if nLapsus > nEvery
oPrg:SetPos( ++nPos )
nLapsus := 0
endif

end

oPrg:SetPos( 100 )

Re: increase aplication speed

Posted: Wed Aug 17, 2011 2:02 pm
by fafi
Mr. Charles..
Thanks

Regards
Fafi

Re: increase aplication speed

Posted: Thu Aug 25, 2011 1:32 pm
by MarcoBoschi
fafi,
i've tested it at work in a lan.
1,5 million records
If I call your function 116 seconds
If I don't call your function 24 seconds

probably I don't understand how to use it

best regards

marco

Code: Select all

#include "fivewin.ch"
ANNOUNCE RDDSYS

FUNCTION MAIN()
LOCAL nInizio := SECONDS()
LOCAL nConta := 0
LOCAL lCall

SET DELETED ON
SET EXCLUSIVE OFF
lCall := MsgYesNo( "Call the function?" )
USE parts
GO TOP

DO WHILE !EOF()
   IF lCall
      memoryflush()
      sysrefresh()
   ENDIF
   SKIP
   nConta ++
ENDDO

? SECONDS() - nInizio   , nConta

RETURN NIL

INIT PROCEDURE RddInit
REQUEST DBFFPT
REQUEST DBFCDX
rddSetDefault( "DBFCDX" )


FUNCTION MemoryFlush()

local nResult
local MemorySize := 1024*1024*1024

if nResult := SetProcess( GetCurrentProcess(), MemorySize, MemorySize*2 )   <= 0
     MemorySize := 512*1024*1024
     if nResult := SetProcess( GetCurrentProcess(), MemorySize, MemorySize*2 )  <= 0
         MemorySize := 64*1024*1024
         if nResult := SetProcess( GetCurrentProcess(), MemorySize, MemorySize*2 )  <= 0
              MemorySize := 32*1024*1024
              if nResult := SetProcess( GetCurrentProcess(), MemorySize, MemorySize*2 ) <= 0
                 nResult := SetProcess( GetCurrentProcess(), -1, -1 )   <= 0
              endif
         endif
     endif
endif

SysRefresh()

RETURN nResult

DLL32 Function SetProcess( ;
   hWnd As LONG, nMinWorkingSpace As LONG, nMaxWorkingSpace As LONG ) ;
   As LONG PASCAL From "SetProcessWorkingSetSize" Lib "Kernel32.dll"

DLL32 Function GetCurrentProcess() ;
   As LONG PASCAL From "GetCurrentProcess" Lib "Kernel32.dll"
 

Re: increase aplication speed

Posted: Sat Aug 27, 2011 8:08 am
by fafi