实用的经验与技巧--代码&速度优化上-钱玉炜
Access软件网QQ交流学习群(群号码198465573),欢迎您的加入!
首页 >技术文章> 综合其它


实用的经验与技巧--代码&速度优化上

发表时间:2007/11/1 8:48:10 评论(0) 浏览(5840)  评论 | 加入收藏 | 复制
   
摘 要:实用的经验与技巧--代码&速度优化上
正 文:
编程人员从程序开发中积累了许多非常实用的经验与技巧

用Mid$命令超速字符串添加操作
从头开始删除集合项目
用InStr函数实现代码减肥
精用Boolean表达式,让代码再减肥
函数名巧做局部变量
火眼识破隐藏的Variant变量
GoSub在编译程序中速度变慢
减少DoEvents语句的数量
And、Or和Xor:让我们来优化表达式
静态变量慢于动态变量
善用"Assume No Aliasing"编译选项
为常量定义合适的类型
你真正理解"Allow Unrounded Floating Point Operations"选项的含义吗?
除法运算符"\"与"/"的区别
使用"$-类型"字符串函数会更快
妙用Replace函数替代字符串连接操作符&
固定长度字符串数组:赋值快,释放快
创建任意长度重复字符串的简洁方法
未公开的返回数组型函数加速秘诀
深入使用LIKE操作符
另辟蹊径处理字符串中的字符:字节数组法
快速清除数组部分内容
快速初始化Variant和String类型数组
访问简单变量总是快于数组元素值
创建新表时,快速拷贝字段
无闪烁地快速附加字符串到textbox控件
快速找到选中的OptionButton
表单及控件的引用阻止了表单的卸载
重定义编译DLL文件的基地址
快速调入TreeView控件以及ListView控件的子项内容
Friend过程快于Public过程
使用Objptr函数快速查找集合中的对象
使用ObjPtr检测2个对象变量是否指向同一对象
读取文件内容的简洁方法
字体对象克隆招法
精用Boolean表达式,让代码再减肥

当设置基于表达式结果的Boolean型数值时,要避免使用多余的If/Then/Else语句结果。比如:
If SomeVar > SomeOtherVar Then
BoolVal = True
Else
BoolVal = False
End If

上面这段代码就很烦琐,它们可以使用下面的一行代码来替代:
BoolVal = (SomeVar > SomeOtherVar)

括号不是必须的,但可以增加可读性。根据表达式中的操作数不同,后者比前者执行起来大约快50%到85%。后者中的括号对速度没有影响。

有时,使用这个技术实现代码的简练并非很明显。关键是要牢记:所有的比较操作结果或者是0(false),或者是-1(True)。所以,下面例子中的2段代码是完全相同的,但是第2段要运行得快些:

1、传统方法:
If SomeVar > SomeOtherVar Then
x = x + 1
End If

2、更简练的方法
x = x - (SomeVar > SomeOtherVar)

减少DoEvents语句的数量

不要在代码中放置不必要的DoEvents语句,尤其是在时间要求高的循环中。遵循这个原则,至少能在循环中的每N次反复时才执行DoEvents语句,从而增强效率。比如使用下面的语句:
If (loopNdx Mod 10) = 0 Then DoEvents

如果只是使用DoEvents来屏蔽鼠标以及键盘操作,那么就可以在事件队列中存在待处理项目时调用它。通过API函数GetInputState来检查这个条件的发生:
Declare Function GetInputState Lib "user32" Alias "GetInputState" () As Long

If GetInputState() Then DoEvents

为常量定义合适的类型

VB在内部使用最简单、最可能的数据类型保存符号数值,这意味着最通常的数字类型-比如0或者1-都按照Integer类型存储。如果在浮点表达式中使用这些常量,可以通过常量的合适类型来加速程序运行,就象下面的代码:
value# = value# + 1#

这个语句强迫编译器按照Double格式存储常量,这样就省却了运行时的隐含转换工作。还有另外的一种处理方法就是:在常量声明时就进行相应类型的定义,代码如下:
Const ONE As Double = 1

你真正理解"Allow Unrounded Floating Point Operations"选项的含义吗?

来自微软的资料鼓吹:高级优化对话框中的所有编译选项都被认为是不稳定的,它们可能导致不正确的结果,甚至程序崩溃。对于其中的大多数,这种说法是正确的,但是经常有一个叫做"Allow Unrounded Floating Point Operations"的选项能够给予正确的结果,防止应用程序产生bug。考虑下面的代码段:

Dim x As Double, y As Double, I As Integer

x = 10 ^ 18

y = x + 1 ’ this can’t be expressed with 64 bits

MsgBox (y = x) ’ 显示 "True" (不正确的结果)

严格地说,由于X和Y变量不包含相同的数值,MsgBox将显示False。可问题是,由于数值1E18与1E18+1都以相同的64位浮点Double类型来表示,它们最终包含了几乎相同的数值,最后的MsgBox结果将是True。

如果打开了"Allow Unrounded Floating Point Operations"编译选项,VB就能重用已在数学协处理器堆栈中的数值,而不是内存中的数值(比如:变量)。因为FPU堆栈具备80位的精度,因此就可以区分出这2个数值的不同:

’ if the program is compiled using the

’ "Allow Unrounded Floating Point Operations" compiler option

MsgBox (y = x) ’ 显示 "False" (正确的结果)

总结一下:当以解释模式、或者编译的p-code模式、或者编译的native代码模式但关掉"Allow Unrounded Floating Point Operations"选项这3种方式运行一个程序时,所有浮点数字运算在内部都以80位的精度进行处理。但如果有一个数值是存储在64位Double变量中,结果就是接近的了,并且,随后使用那个变量的表达式也将产生近似的结果,而不是绝对正确的结果。

相反,如果打开"Allow Unrounded Floating Point Operations"编译选项后运行一段native编译代码,在随后的表达式中VB就经常能重用内部的80位数值,而忽略存储在变量中的当前数值。注意:我们并不能完全控制这个功能,VB也许对此生效,也许就不生效,这要取决于表达式的复杂程度以及最初分配数值语句与随后产生结果的表达式语句的距离远近。


-> 资料全部来自网络 由 cg1 重新搜集整理 access911.126.com <-

Access软件网交流QQ群(群号:198465573)
 
 相关文章
【access小品】切掉尾巴--刘晓军筛选代码优化  【todaynew  2010/7/20】
类模块_进度条优化版  【AskHeart  2010/12/8】
【雕虫小技】再发窗体换肤:优化程序,提供素材(源码)   【熊熊  2011/6/1】
【Access小品】韬光养晦--线型材料开料优化示例  【煮江品茶  2012/8/19】
数据库优化经验分享  【品茶论道  2013/1/12】
关于风行先生的“组合框自动排除选项示例”的优化  【大漠风  2013/2/3】
存储过程编写经验和优化措施  【周芳(转)  2013/9/17】
回味老漫画:《神秘的程序员们》-18:优化选择   【麥田  2014/4/7】
sql语句优化  【赵文斌  2014/4/20】
常见问答
技术分类
相关资源
文章搜索
关于作者

钱玉炜

文章分类

文章存档

友情链接