|
HackVBASpeed 通过深入挖掘VBA的潜能, 获得最佳性能的代码, 同时也深入了解VBA的设计, 触发自己写出更好的代码.
很久前, 某书或某网文, 说在long型作为判断式时, 省略其 比较运算符 速度会比较快. 这个是真的吗? 所以我一直使用( if len(strx) then ) 来判定字符串是否为空.(len函数返回long)
今天突然想到这个, 那就来验证一下真理, 其结果并非如此:
integer 与 boolean 相同
long型
分析:
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的子集. 感觉自己的还是半桶水, 不完善地方好多.
学习永远在路上
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
评分
-
查看全部评分
|