设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

123下一页
返回列表 发新帖
查看: 4992|回复: 22
打印 上一主题 下一主题

[模块/函数] 【原创 / 文章】四种整数数据类型的性能对比

[复制链接]
跳转到指定楼层
1#
发表于 2005-9-5 01:02:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  在我们写VBA程序的时候,我们经常要面对数据类型定义的选择,有的情况下,业务本身对于数据类型有要求和限制,那么我们并不难以选择,有些时候却没有限制,我们可以任意选用四种整数类型(Byte,Integer,Long,Currency)中的一种,例如:

For i=1 to 100

  在这行代码中,我们该把变量i定义为什么类型的变量呢?显然四种整数类型都可以正常运行,但是他们的效率是否相同呢?我们到底该如何选择?有的人说,当时是选最小的数据类型Byte,有的人说在32位系统上,32位的Long类型才是效率最高的。

  那么究竟谁说的是正确的,让我们来进行一下这四种整数类型的性能对比测试,我们使用如下代码:

Const LoopTimes = 100000000

Public Sub test()

    Dim bytTmp As Byte

    Dim intTmp As Integer

    Dim lngTmp As Long

    Dim curTmp As Currency

    Dim loopCount As Long

   

    Dim timeBegin As Single

    Dim timeEnd As Single

    Dim timeAddition As Single

   

    timeBegin = Timer

    For loopCount = 0 To LoopTimes

    Next loopCount

    timeEnd = Timer

    timeAddition = timeEnd - timeBegin

   

   

    timeBegin = Timer

    For loopCount = 0 To LoopTimes

        bytTmp = 255

    Next loopCount

    timeEnd = Timer

    Debug.Print "Byte :"; timeEnd - timeBegin - timeAddition; "秒"

    timeBegin = Timer

    For loopCount = 0 To LoopTimes

        intTmp = 255

    Next loopCount

    timeEnd = Timer

    Debug.Print "Integer :"; timeEnd - timeBegin - timeAddition; "秒"

    timeBegin = Timer

    For loopCount = 0 To LoopTimes

        lngTmp = 255

    Next loopCount

    timeEnd = Timer

    Debug.Print "Long :"; timeEnd - timeBegin - timeAddition; "秒"

    timeBegin = Timer

    For loopCount = 0 To LoopTimes

        curTmp = 255

    Next loopCount

    timeEnd = Timer

    Debug.Print "Currency :"; timeEnd - timeBegin - timeAddition; "秒"

    Debug.Print "*********************"

End Sub

  在这里,我们对每个整数类型进行了1亿次的赋值操作,同时减去了循环控制所消耗的空转时间,剩下的就是纯粹的赋值操作所需的时间。最后,让我们来看看运行的结果:

Byte : 7.234375 秒

Integer : 2.421875 秒

Long : 3.4375 秒

Currency : 4.84375 秒

*********************

Byte : 7.234375 秒

Integer : 2.421875 秒

Long : 3.453125 秒

Currency : 4.875 秒

*********************

Byte : 7.21875 秒

Integer : 2.421875 秒

Long : 3.421875 秒

Currency : 4.875 秒

*********************

  看到这里,我想大家都应该很清楚了,虽然Byte占用内存最少,但是他的性能却是最差的,如果对于单个变量,我们没有必要使用Byte,当然Byte在大块数据段进行指针操作的时候,还是有他的非凡之处。剩下三种整数数据类型里面,Integer性能最佳,Currency性能最差。我们尽可能选择能够满足我们业务需要的最小数据类型。

  上面是赋值操作的性能对比,下面我们来进行位操作的性能对比测试,我们使用如下代码:

<DIV class=quote>

Const LoopTimes = 10000000

Public Sub test()

    Dim bytTmp As Byte

    Dim intTmp As Integer

    Dim lngTmp As Long

    Dim curTmp As Currency

    Dim strTmp As String

    Dim loopCount As Long

   

    Dim timeBegin As Single

    Dim timeEnd As Single

    Dim timeAddition As Single

   

    timeBegin = Timer

    For loopCount = 0 To LoopTimes

        strTmp = 255

    Next loopCount

    timeEnd = Timer

    timeAddition = timeEnd - timeBegin

   

   

    timeBegin = Timer

    For loopCount = 0 To LoopTimes

        strTmp = bytTmp Or 255

    Next loopCount

    timeEnd = Timer

    Debug.Print "Byte :"; timeEnd - timeBegin - timeAddition; "秒"

    timeBegin = Timer

    For loopCount = 0 To LoopTimes

        strTmp = intTmp Or 255

    Next loopCount

    timeEnd = Timer

    Debug.Print "Integer :"; timeEnd - timeBegin - timeAddition; "秒"

    timeBegin = Timer

    For loopCount = 0 To LoopTimes

        strTmp = lngTmp Or 255

    Next loopCount

    timeEnd = Timer

    Debug.Print "Long :"; timeEnd - timeBegin - timeAddition; "秒"

    timeBegin = Timer

    For loopCount = 0 To LoopTimes

        strTmp = curTmp Or 255

    Next loopCount

    timeEnd = Timer

    Debug
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2005-9-5 03:12:00 | 只看该作者
烦请LucasLynn斑竹看一下下面库中的查询,为什么只有8条记录,应该为9条才对

好像就是数据类型的问题

游客,如果您要查看本帖隐藏内容请回复


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
3#
发表于 2005-9-5 03:55:00 | 只看该作者

回复:(sea.er)烦请LucasLynn斑竹看一下下面库中的查...

<DIV class=quote>以下是引用sea.er在2005-9-4 19:12:00的发言:



烦请LucasLynn斑竹看一下下面库中的查询,为什么只有8条记录,应该为9条才对

好像就是数据类型的问题



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
4#
发表于 2005-9-5 04:58:00 | 只看该作者
不可能啊,我的00056738前后都没有空格啊请大家帮忙看看
5#
发表于 2005-9-5 06:02:00 | 只看该作者
在  银行posjt  中的 567.3 前面是有一个隐藏的字符.我也曾有过查询不准的情况,但没注意是此种情况,如今总算见识了.
6#
发表于 2005-9-5 06:07:00 | 只看该作者
公司posjt表有8条记录,银行posjt表也只有8条记录和它对应,因此只能显示8条记录,有什么疑问吗?
7#
发表于 2005-9-5 06:13:00 | 只看该作者
公司posjt表有9条记录啊,青青小姐
8#
发表于 2005-9-5 06:25:00 | 只看该作者
以下是引用灵芝在2005-9-4 22:02:00的发言:



在  银行posjt  中的 567.3 前面是有一个隐藏的字符.

我也曾有过查询不准的情况,但没注意是此种情况,如今总算见识了.

奇怪,我用len(交易金额),567.3明明显示的是5,怎么会多出来一个字符呢?!
9#
 楼主| 发表于 2005-9-5 19:48:00 | 只看该作者
你们这些帖子回的……好像和这个主题一点关系都没有……提问可以专门开个帖子嘛。[em06]
10#
 楼主| 发表于 2005-9-5 19:52:00 | 只看该作者
你这个问题我看了,不是什么特殊字符的问题,特殊字符问题可能会存在于文本格式字段中,不会存在于数值类型字段中。

造成不匹配的原因是因为“精度类型”,我在前几天的帖子里面专门谈过这个问题,在这里就不重复解释具体的原因了,解决办法是把数值类型改成货币。

以后记住,单精度、双精度类型只能作大小比较,不能作等于比较,更不能用他来作为关联。

[此贴子已经被作者于2005-9-5 11:53:06编辑过]

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-28 13:51 , Processed in 0.153507 second(s), 35 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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