2008-01-26

vfp程式優化準則

vfp程式優化準則

◆ 內存的影響
為保證留更多的內存給程式使用以增進其效率,用戶自定義窗口、菜單、內存變量等組件,請在需要使用前才去定義、建立,並在使用後立刻將它們從內存中清除,而切勿在程式的開頭處一併定義、建立完畢。

◆ LockScreen屬性使用技巧
---以批次更新方式來加速表單的更新速度
  更改表單內控制項的一些影響其外觀的屬性前最好設定
thisform.lockscreen=.t.

  發出表單刷新命令thisform.refresh後應設定
thisform.lockscreen=.f.

◆ 加快VFP啟動速度
VFP在啟動時會搜尋下列文件:
Beaitify.app
Browse.app
Builder
Config.fpw
Convert.app
Coverage.app
Foxuser.dbf
Gallery.app
Genhtml.prg
Genmenu.prg
Dsdnv98.col
Runactd.prg
Scctext.prg
Spellchk.app
Transrort.prg
Vfp6stport.prg
Vfpxtab.prg
Wizard.app
假如你的應用程式並沒有使用到資原始檔案或幫助檔,請在config.fpw中進行下列設定來將它們關閉,以免VFP多花時間去尋找它們。
Resource=off
Help=off

至於其他VFP啟動時所必須搜尋的文件,則僅會在VFP所在的目錄下被搜尋。如果你將這些檔放在別的地方,請在config.fwp中加以指明。例如:

_genxtab=c:\crosstab\vfpxtab.prg
_convert=c:\convert\convert.app

又假如你不想使用其中的某些檔,,也請在config.fpw中指明以加快VFP的啟動速度,比方說,假設你不想使用 convert.app, 請在config.fpw 中加入下面一行敘述。
_convert=』』


◆ 文件的開啟

將那些經常要使用的表一直保持在開啟狀態。


◆ 以名稱運算式(Name Expression) 來取代宏替換。


◆ 以 evaluate() 來取代宏替換


◆ 計數循環
用for…endfor 取代 do while…enddo

◆ 表掃瞄循環
用scan…endscan 取代 do while…enddo
當需要進行條件過濾時,可直接在scan命令加入for 參數進行過濾處理

◆ 數組專用循環
使用for each…endfor


◆ 用gather 取代 replace

◆ 數據記錄的新增
速度最快者:使用SQL的insert into 命令新增數據記錄
速度較快者:先下達append blank 命令再執行 gather 命令寫入數據
速度最慢者:先下達append blank 命令再執行 replace…with 命令寫入數據。

如果你在網絡上要一次寫入數十筆、數百筆、甚至更大量的數據至一個共用表中,最快的作法是:
先將這些數據存放到一個數組中,最後再使用insert into… from array 命令一次寫入表,其速度上差異可達數百倍之巨。


◆ 暫存表(cursor)
如果你利用sql的select 命令所獲取的查詢結果是要存放在一個中繼(即中間結果表)處理用的暫存表中,請使用 into cursor 參數。


◆ 多重欄位處理
用 scatter to array 取代 scatter memvar


◆ 數據記錄的檢索
用 indexseek() 取代 seek命令與 seek()函數

◆ 善用lookup()函數進行數據的檢索處理

◆ 字串比較
假如你要進行字串或備註欄位中的字串檢索,想必下列各個字串檢索函數的速度比較對對你有所幫助:

$ > at() > atc() > inlist() > occurs() > ascan()
$ > rat() > ascan()

◆ 極多筆數據記錄的新增與索引
如果你需要將很多筆的數據記錄新增到一個已經建立了索引的表中,新增前請先關閉索引,而在新增完畢。再去重建索引(reindex).


◆ 復合索引檔與超大型表
如果在一個表很大,且其復合索引又多,可改用非結構化復合索引檔。

◆ DO命令的使用
儘量不使用DO 命令中的 IN programName 參數。


◆ 在任何一個目錄下的文件數不要超過255個。

◆ 假如使用 select…group by 與 select distinct 命令都能獲得相同的結果,建議採用前者。

◆ 以可能使用表單、報表的數據環境
因為VFP會使用底層引擎調用來打開表並設置索引與關係。
◆ 限制表單集(Formset)中的表單數量

只有當你同時需要多個表單且這些表單要共用一私有數據序列時,才有必要使用表單集。

◆ 動態載入分頁框(頁框架 PageFrame)中的控制項
作法是:除了一開始要顯示的頁面外,分別將每一個頁面中的所有控制項儲存成一個自定義類,然後當某一個頁面成為當前頁時,再將此自定義類加至頁中。

◆ 動態連接控制項與數據項
當你的表單中有很多控制項時,如果你能夠讓表單中的控制項在需要時才與其數據相連接,將可加速表單被載入的速度。
作法:在必須與數據相連的控制項的GotFocus事件中編程連接到數據的代碼,以便使控制項在成為作用控制項時才與數據相連接。比如,下列的程式將顯示框連接至表foxman的「職工姓名」欄位:
if this.rowsource=』』
this.rowsource=」foxman.職工姓名」
this.rowsourcetype=6
this.refresh
endif



◆ 反覆存取一個屬性時,如何最佳化其速度

nCount = thisform.ControlCount
for i = 1 to nCount
?thisform.Controls(i).Name
endfor
就比
for i = 1 to thisform.ControlCount
?thisform.Controls(i).Name
endfor
快很多


又例如,我想改變一個數組屬性所有元素的內容,就應該這樣做。

Local MediaArray[256]

For I = 1 to 256
MediaArray[i] = 「000」+ltrim(str(I))
Endfor
Acopy(MediaArray,thisform.aUsrId) && 將數組中的內容一次複製到數組屬性中
◆ 如何更快度存取同一個控制項的多個屬性

應該這樣:
with thisform.CurstFrame.Page3.WordContainer.AuthorEditBox
.value=『童心未泯』
.FontName=』宋體』
.FontSize=12
.FontBold=.T.
.ForeColor=255
endwith

或者

MyControl= thisform.CurstFrame.Page3.WordContainer.AuthorEditBox
MyControl.value=『童心未泯』
MyControl.FontName=』宋體』
MyControl.FontSize=12
MyControl.FontBold=.T.
MyControl.ForeColor=255

◆ 在常被引發或調用的事件與方法中的程式代碼應儘可能精簡
如Refresh方法與Paint事件經常被調用或觸發。

如果你想要加快表單的載入效率,也該儘可能將Init 事件程式的代碼移至較少被調用或觸發的事件程式中(例如Activate、Click與GotFocus),並利用某屬性(例如:Tag屬性或自定義屬性)來判斷控制項是否已執行僅需要執行一次的程式代碼。


◆ 慎重選擇數據類型
使用正確的數據類型也會加快執行的速度,比方說,如果欄位所要存儲的數值是介於-2147483647-217483647之間,則採用整數類型(Integer)就會比使用數值型(Numeric)來得有效率。

更重要的是,如果可能的話,儘可能以整數類型的欄位作為主鍵值與外鍵值。

◆ VarType()比Type()快

◆ NewObject() 比 CreateObject() 快

◆ NewObjec 方法 比 AddObject 方法快

◆ 加快 OLE 組件的使用效率

原則:
1) 事先啟動自動化服務器
2) 將組件插入通用欄位中
3) 儘可能使用圖片控制項(Image Control)
4) 儘可能使用人工連接方式

◆ 提升自動化的速度

要想提升自動化的速度,你就應該避免同時建立同一個自動化服務器的多個實例。建議應使用GetObject()而不要用CreateObjec()函數。

0 Comments:

張貼留言

<< Home