四种整数数据类型的性能对比

数据|数据类型|性能

在我们写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性能最差。我们尽可能选择能够满足我们业务需要的最小数据类型。

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

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.Print "Currency :"; timeEnd - timeBegin - timeAddition; "秒"
    Debug.Print "*********************"

End Sub

  这里,我们所比较的是逐位或操作,同样我们扣除了循环控制时间,赋值时间,下面让我们来看看结果:

Byte : .625 秒
Integer : .296875 秒
Long : .296875 秒
Currency : .890625 秒
*********************
Byte : .609375 秒
Integer : .34375 秒
Long : .328125 秒
Currency : .90625 秒
*********************
Byte : .484375 秒
Integer : .265625 秒
Long : .203125 秒
Currency : .8125 秒
*********************
Byte : .53125 秒
Integer : .328125 秒
Long : .28125 秒
Currency : .875 秒
*********************

  我们可以看到,在位操作项目上,Byte赶上了Currency成了第三名,而Integer和Long则咬得很紧,但是最终还是Long胜出了,看来在32位系统上,32位数据类型确实有位操作上的优势,不要以为1字节位操作就会比4字节位操作快,事实上正好相反,4字节>2字节>1字节。

  综合以上表现,我们的结论是,Byte和Currency的表现是最差的,但是这两个数据类型有他们的特殊用途,Byte适用于内存块的批量操作,Currency适用数据类型不确定的时候,剩下的Integer和Long,Integer在赋值操作上更快,Long在位操作上更快。

  现在你知道该如何选择整数数据类型了吗?

时间: 2023-12-01 23:34:06

四种整数数据类型的性能对比的相关文章

c++中四种强制类型转换及区别对比

C++四种强制类型 reinterpret_cast<目标类型>(原类型变量)//重解释类型转换  dynamic_cast<new_type>(expression)//动态类型转换  static_cast<new_type>(expression)//静态类型转换  const_cast<new_type>(expression)//返回一个指向非常量的指针   1.const_cast:常量指针被转化成非常量的指针,并且仍然指向原来的对象:常量引用被

javascript 三种数组复制方法的性能对比_javascript技巧

我们以一个拥有500000个子项的数组, 作为测试对象(IE不会崩溃哦!). copyBySlice copyByConcat copyByLoop

HashMap循环遍历方式及其性能对比

主要介绍HashMap的四种循环遍历方式,各种方式的性能测试对比,根据HashMap的源码实现分析性能结果,总结结论. 1. Map的四种遍历方式 下面只是简单介绍各种遍历示例(以HashMap为例),各自优劣会在本文后面进行分析给出结论. (1) for each map.entrySet() Java 1 2 3 4 5 Map<String, String> map = new HashMap<String, String>(); for (Entry<String,

PHP5.5四种序列化性能对比

json_encode,serialize,igbinary,msgpack四种序列化方式,在之前已经有过相关的测试,PHP5.5这方面的测试暂时没有,这次测试基于PHP5.5,并且测试用例,http://blog.csdn.net/hguisu/article/details/7651730的测试用例是一样的,只是从这个测试上家里igbinary serialize的测试,作为对比,可以参考http://www.ooso.net/archives/538 运行环境        PHP5.5

ArrayList和LinkedList的几种循环遍历方式及性能对比分析

主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayList和LinkedList的源码实现分析性能结果,总结结论. 通过本文你可以了解(1)List的五种遍历方式及各自性能 (2)foreach及Iterator的实现 (3)加深对ArrayList和LinkedList实现的了解. 阅读本文前希望你已经了解ArrayList顺序存储和LinkedList链式的结构,本文不对此进行介绍. 相关:HashMap循环遍历方式及其性

MySQL 四种事务隔离级别详解及对比_Mysql

MySQL 四种事务隔离级别详解及对比 按照SQL:1992 事务隔离级别,InnoDB默认是可重复读的(REPEATABLE READ).MySQL/InnoDB 提供SQL标准所描述的所有四个事务隔离级别.你可以在命令行用--transaction-isolation选项,或在选项文件里,为所有连接设置默认隔离级别. 例如,你可以在my.inf文件的[mysqld]节里类似如下设置该选项: transaction-isolation = {READ-UNCOMMITTED | READ-CO

oracle 10g数据泵和导入导出性能对比(四)并行度对数据泵导出的影响

前一段时间在一次迁移中同时用到了数据泵和EXP,发现二者效率的差别还是相当大的.这里通过一个例子简单比较一下. 这篇文章讨论并行度对数据泵导出的影响. 写前几篇文章的时候对数据泵还了解不多,最近阅读文档发现,并行的设置也是有技巧的,如果设置的合理,可以明显的提高导出的性能. 首先还是看一下CPU的数量: SQL> show parameter cpu NAME TYPE VALUE ------------------------------------ ----------- --------

C++中几种callable实现方式的性能对比

前言 C++中想实现一个callable的对象,通常有四种方式: std::function:最common的方式,一般会配合std::bind使用. function pointer:最C的方式,但没办法实现有状态的callable object. function object:就是重载了operator()的类,C++98的STL中经常用. lambda expression:不会污染namespace,一般来说编译器内部会实现为一个匿名的function object. 从原理上性能最好

linux下实现web数据同步的四种方式(性能比较)_Linux

实现web数据同步的四种方式 ======================================= 1.nfs实现web数据共享2.rsync +inotify实现web数据同步3.rsync+sersync更快更节约资源实现web数据同步4.unison+inotify实现web数据双向同步 ======================================= 一.nfs实现web数据共享  nfs能实现数据同步是通过NAS(网络附加存储),在服务器上共享一个文件,且服务器