设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

123下一页
返回列表 发新帖
查看: 5321|回复: 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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
23#
发表于 2009-10-24 11:17:37 | 只看该作者
谢谢比较,有些明白了。
22#
发表于 2008-2-27 16:27:44 | 只看该作者
学习....中ING.........

点击这里给我发消息

21#
发表于 2006-8-8 22:26:00 | 只看该作者
版主的这一课上得非常直观,获益非浅.
20#
发表于 2006-8-4 20:01:00 | 只看该作者
好!!
19#
 楼主| 发表于 2005-9-6 04:35:00 | 只看该作者
以下是引用ahah在2005-9-5 19:04:00的发言:

首先声明一点,我并没有改动表的任何数据类型,只是将那条记录的前、后做了删除(可能是不可见字符),就得到了正确的结果。希望你们不要把问题想得太复杂,容易误导人!

  在我的电脑上,我首先看了这条记录的前后,均没有出现异常字符,我甚至把两个表中的这两个字段都删除,重新输入,还是一样得到8条记录。我将两表字段类型改为货币,结果正确,9条记录。

  或许你说的原因是正确的,但是一个程序员犯错误,往往是不良好的编程习惯引起的,有良好的编程习惯,严谨的代码风格,可以避免很多很多的错误,在这个例子中,或许这次真的有非法字符,删除后解决了,但是双精度数值比较的问题迟早会遇到,我敢保证数据条目超过5000条后,一定会遇到双精度数值等于比较的错误。所以我想现在提出来并不算太早。我觉得这并不属于一种误导。

[此贴子已经被作者于2005-9-5 21:17:01编辑过]

18#
发表于 2005-9-6 04:11:00 | 只看该作者
第一、LucasLynn 的说法是可靠的。更改数据类型后,得到了正确的结果: 9 条记录第二:ahah 的操作,我不明白。
17#
发表于 2005-9-6 03:04:00 | 只看该作者
首先声明一点,我并没有改动表的任何数据类型,只是将那条记录的前、后做了删除(可能是不可见字符),就得到了正确的结果。希望你们不要把问题想得太复杂,容易误导人!
16#
 楼主| 发表于 2005-9-6 02:56:00 | 只看该作者
以下是引用wu8313在2005-9-5 17:52:00的发言:



已经将两个表 金额 字段 的数据类型全部设为 货币,结果查询中的 记录数 又只有 7 条了。

但是,如果删除 金额 的一对一关系的话,就可以得到 9 条记录了。不明白。

不过,可以试一下将 金额 字段,进行一番自定义函数的转化,然后进行一对一联接,看看如何。



我作了测试了,结果完全正确,对帐记录9条。

你是不是只改了字段的格式为货币,而不是改字段的类型为货币。
15#
发表于 2005-9-6 01:52:00 | 只看该作者
已经将两个表 金额 字段 的数据类型全部设为 货币,结果查询中的 记录数 又只有 7 条了。

但是,如果删除 金额 的一对一关系的话,就可以得到 9 条记录了。不明白。

不过,可以试一下将 金额 字段,进行一番自定义函数的转化,然后进行一对一联接,看看如何。



[此贴子已经被作者于2005-9-5 18:01:47编辑过]

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

本版积分规则

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

GMT+8, 2024-9-24 23:29 , Processed in 0.096433 second(s), 36 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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