设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 1707|回复: 2
打印 上一主题 下一主题

[模块/函数] HackVBASpeed 之判断类型速度对比

[复制链接]
跳转到指定楼层
1#
发表于 2015-8-8 15:33:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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

评分

参与人数 1经验 +12 收起 理由
admin + 12 优秀源创!加分鼓励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅

点击这里给我发消息

2#
发表于 2015-8-8 17:17:18 | 只看该作者
好文,赞一个!加分
3#
发表于 2015-8-9 13:54:34 | 只看该作者
在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。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-6 23:34 , Processed in 0.096809 second(s), 28 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表