主题:[转帖]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()函数。
摘自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()函数。