Office中国论坛/Access中国论坛

标题: HackVBASpeed 之判断类型速度对比 [打印本页]

作者: wang1999    时间: 2015-8-8 15:33
标题: HackVBASpeed 之判断类型速度对比
HackVBASpeed 通过深入挖掘VBA的潜能, 获得最佳性能的代码, 同时也深入了解VBA的设计, 触发自己写出更好的代码.

很久前, 某书或某网文, 说在long型作为判断式时, 省略其 比较运算符 速度会比较快. 这个是真的吗? 所以我一直使用( if len(strx) then ) 来判定字符串是否为空.(len函数返回long)
今天突然想到这个, 那就来验证一下真理, 其结果并非如此:

integer 与 boolean 相同
[attach]57029[/attach]

long型
[attach]57030[/attach]

分析:
1. lRet 直接作为判断式  integer 比 long 快了2.34倍 (346:808): 所有VBA的BOOLEAN数据的类型为 short,  即为VB的integer型, 所以不需要类型转换
2. long型 时, lRet VS  lRet<>0 , lRet<>0 要快1.33倍: lRet 要转变类型后再作为结果, 而 lRet<>0 直接取 cmp 后的结果
3.  integer型 时, lRet VS  lRet<>0 , lRet 要快1.8倍:  lRet 直接作为结果, 而 lRet<>0 需要cmp再取得结果
integer型  lRet = Boolean型  lRet < (long型  lRet<>0) <  ( integer型  lRet<>0) < (integer型  lRet)

结论:
我们使用long型作为判断时, 不要省略 比较运算符.
只有在 integer 型作为判断时, 省略 比较运算符 速度要快.


环境:
笔记本测试时, CPU的节能状态(初始时CPU不会完全), 会影响其结果
多核CPU测试的准确度应该比单核要差.
QueryPerformanceCounter 可以到微秒, timeGetTime 到毫秒.这里为QueryPerformanceCounter

VB6:
搞不懂, 在VB6下   integer 与 long 的编译后的汇编竟然一样, 实在是不懂. (而VBA汇编我不会查看)
Private Sub TestFunc(var1 As Integer)
'Private Sub TestFunc(var1 As Long)
    If var1 <> 0 Then
'    If var1 Then
        var1 = &H2222
    End If
End Sub



004027C0  mov         eax,dword ptr [esp+8]  
004027C4  cmp         word ptr [eax],0  
004027C8  je          004027CF  


PS:

前几天通过重读"Hardcore Visual Basic 5"才知道VB可以比喻为是VBA的客户. 也就是说VB是VBA的子集. 感觉自己的还是半桶水, 不完善地方好多.
学习永远在路上





作者: admin    时间: 2015-8-8 17:17
好文,赞一个!加分
作者: ganlinlao    时间: 2015-8-9 13:54
在32位系统中,在vba的所有数字型类型中,long的计算性能是最快的。integer和byte都不如long快。因为它们都要先补码成4字节,然后再进行计算。
在64位系统中,vba的所有数字型类型中,longlong注定会是计算性能最快的
至于true和false这是一个常量。都是vba中早定义好的,true等价于-1(几乎所有basic语言都是这样定义的),false等价于0。小心,真正的true的定义:非false。也就是非0。所以在调用api时,涉及到c/c++语系的true就要小心了。它返回值一定不是-1。




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3