 |
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
kinjan
註冊時間: 2006-02-15 文章: 25
第 1 樓
|
發表於: 星期五 三月 17, 2006 7:32 pm 文章主題: VFP程序优化准则 |
|
|
摘自VFP天堂 http://foxtiantang.vicp.net
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()函数。 |
|
回頂端 |
|
 |
qasnet
註冊時間: 2006-03-29 文章: 20
第 2 樓
|
發表於: 星期四 三月 30, 2006 9:50 pm 文章主題: Re: VFP程序优化准则 |
|
|
>如果你在网络上要一次写入数十笔、数百笔、甚至更大量的数据至一个共享表
>中,最快的作法是:
>先将这些数据存放到一个数组中,最后再使用insert into… from array 命令一
>次写入表,其速度上差异可达数百倍之巨。
網路上現下大多是資料庫....SQLExec可以用array嘛?
我都是在要丟上去的table中scan
在scan迴圈中下sqlexec
結束迴圈後再 SQLCommit
有沒有更有效率的做法? |
|
回頂端 |
|
 |
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|