Office中国论坛/Access中国论坛

标题: 【原创 / 文章】四种整数数据类型的性能对比 [打印本页]

作者: LucasLynn    时间: 2005-9-5 01:02
标题: 【原创 / 文章】四种整数数据类型的性能对比
  在我们写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
作者: sea.er    时间: 2005-9-5 03:12
烦请LucasLynn斑竹看一下下面库中的查询,为什么只有8条记录,应该为9条才对

好像就是数据类型的问题




作者: ahah    时间: 2005-9-5 03:55
标题: 回复:(sea.er)烦请LucasLynn斑竹看一下下面库中的查...
<DIV class=quote>以下是引用sea.er在2005-9-4 19:12:00的发言:



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

好像就是数据类型的问题

[attach]12915[/attach]


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



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

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

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

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

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

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


作者: sea.er    时间: 2005-9-5 19:52
不好意思,我占用一下,你再开新帖吧,呵呵另:把我的问题解决一下
作者: LucasLynn    时间: 2005-9-5 19:58
以下是引用sea.er在2005-9-5 11:52:00的发言:



不好意思,我占用一下,你再开新帖吧,呵呵

另:把我的问题解决一下

已经回复你了。在你写这个回帖的时候……

明显我打字比你快嘛。[em05]
作者: sea.er    时间: 2005-9-5 20:05
甘拜下风!

看了你的回复,说明俺的问题还是字段类型的问题,说明俺不是在给你添乱吧,呵呵



另:十分感谢!希望大家都能受益!

[此贴子已经被作者于2005-9-5 12:07:03编辑过]


作者: LucasLynn    时间: 2005-9-5 21:41
以下是引用sea.er在2005-9-5 12:05:00的发言:



甘拜下风!

看了你的回复,说明俺的问题还是字段类型的问题,说明俺不是在给你添乱吧,呵呵

另:十分感谢!希望大家都能受益!





关于你这个问题,我们专门写了一个帖子介绍单精度/双精度类型的特点,你可以参考一下,就知道为什么会遇到这个问题了。
作者: wu8313    时间: 2005-9-6 01:52
已经将两个表 金额 字段 的数据类型全部设为 货币,结果查询中的 记录数 又只有 7 条了。

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

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



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


作者: LucasLynn    时间: 2005-9-6 02:56
以下是引用wu8313在2005-9-5 17:52:00的发言:



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

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

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



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

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

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

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

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

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


作者: 古老的龙    时间: 2006-8-4 20:01
好!!
作者: t小宝    时间: 2006-8-8 22:26
版主的这一课上得非常直观,获益非浅.
作者: REORX    时间: 2008-2-27 16:27
学习....中ING.........
作者: chaojianan    时间: 2009-10-24 11:17
谢谢比较,有些明白了。




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