快捷搜索:

VB超频快餐,让我一次用个够!(三)

静态变量慢于动态变量

在历程中引用静态局部变量要比引用老例局部动态变量慢2-3倍。要想真正地加速历程的履行速率,最彻底的措施便是将所有的静态变量转换为模块级别变量。

这种措施的独一不够是:历程很少是自包孕的,假如要在其他工程中重用,就必须同时拷贝并粘贴这些模块级别变量。

别的的一种处置惩罚措施是:在光阴要求高的轮回前,将静态变量数值装入动态变量中。

善用"Assume No Aliasing"编译选项

听说,假如历程能够2次或多次引用同样的内存地址,那么历程就会包孕又名数值。一个范例的例子如下:

Dim g_GlobalVariable As Long

...

Sub ProcWithAliases(x As Long)

x = x + 1

g_GlobalVariable = g_GlobalVariable + 1

End Sub

假如通报给这个历程g_GlobalVariable变量,则将经由过程一个直接引用以及x参数两种要领修改变量的数值2次。

又名数值常常是不良编程习气的产物,对付法度榜样优化有害无益。事实上,假如能够完全确认利用法度榜样从来没有应用到又名变量,就可以打开"Assume No Aliasing"高档编译选项,这将见告编译器没有历程可以改动同一内存地址,使编译器孕育发生加倍有效率的汇编代码。更特其余是,编译法度榜样将试图缓冲这些数据到CPU的寄存器中,从而显着地加速了法度榜样运行。

总结一下,当碰到以下环境时,就不会有又名数值:(1) 历程不引用任何全局变量 (2) 历程引用了全局变量,但从来不经由过程ByRef参数类型通报同一变量给历程 (3) 历程含有多个ByRef参数类型,但从来不通报同一变量到此中的2个或者多个之中。

你真正理解"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大概对此生效,大概就不生效,这要取决于表达式的繁杂程度以及最初分配数值语句与随后孕育发生结果的表达式语句的间隔远近。

除法运算符"\"与"/"的差别

整数间履行除法运算时,要应用 "\" 而不是 "/"。 "/" 运算符要求返回一个单一数值,以是,外面上看似简单的一行代码:

C% = A% / B%

实际上包孕了3个隐含的转换操作:2个为除法运算做筹备,从Integer转换到Single;一个完成着末的赋值操作,从Integer转换到Single。然则假如应用了"\"操作符,环境就大年夜不相同了!不仅不会有这么多中心步骤,而且履行速率大年夜大年夜前进。

同时请记着:应用"/"操作符做除法运算时,假云云中之一是Double类型,那么结果就将是Double类型。以是,当2个Integer或者Single类型数值做除法运算时,假如想获得高精度的结果,就必要手工逼迫此中之一转换为Double类型:

’结果为 0.3333333

Print 1 / 3

’结果为 0,333333333333333

Print 1 / 3#

应用"$-类型"字符串函数会更快

VB官方文档彷佛很鼓励应用"无$"类字符串函数,比如:Left、LTrim或者UCase,而不是实现同样功能的Left$、LTrim$和UCase$函数。然则我们必须熟识到:前者返回variant类型的数值,当用于字符串表达式中时,终极必须要转换为字符串(string)类型。

是以,在严格要求光阴的代码段中,我们应该应用后者,它们将快5-10%。

您可能还会对下面的文章感兴趣: