仕事でJavaの処理時間に関して調べている時、VBAに関する面白い記述を見つけました。
VBAだと、Integer型とLong型だとLong型の方が処理性能が良いというのです
VBAで使用できる
Integer型は-32768~32767の整数
Long型は-2147483,648~2147483647の整数
JavaのInteger型は-2147483,648~2147483647の整数を取れるのでVBAの型のサイズが小さく感じます。
プログラミングをしている身としてはInteger型よりLong型の方が処理性能が良いというのはにわかには信じられませんでした。
一般的には桁数上限が小さい型の方がメモリ使用量が小さく、処理にかかる時間が小さいんです。
ということで、自分で実際にInteger型とLong型処理を作り、処理時間の計測を行いました。
【Integer型の処理】
Sub int型()
Dim startTimer As Double
Dim endTimer As Double
Const MAX_MATH As Integer = 10000
Const MIN_MATH As Integer = -10000
Dim integerValue As Integer
Dim 和 As Integer
Dim 差 As Integer
Dim 積 As Integer
Dim 商 As Integer
Dim 余 As Integer
Dim cnt As Integer
startTimer = Timer
'処理回数を増やすため10000回ループさせます。
For cnt = 0 To 9999 Step 1
' (-10000~10000の間の値で簡単な演算を行います)
For integerValue = MIN_MATH To MAX_MATH Step 1
和 = integerValue + 2
差 = integerValue - 2
積 = integerValue * 2
商 = integerValue / 2
余 = integerValue Mod 2
Next integerValue
Next cnt
endTimer = Timer
MsgBox "Integer型処理" & endTimer - startTimer & "秒"
End Sub
【Long型の処理】
Sub long型()
Const MAX_MATH As Long = 10000
Const MIN_MATH As Long = -10000
Dim longValue As Long
Dim 和 As Long
Dim 差 As Long
Dim 積 As Long
Dim 商 As Long
Dim 余 As Long
Dim cnt As Long
startTimer = Timer
'処理回数を増やすため10000回ループさせます。
For cnt = 0 To 9999 Step 1
' (-10000~10000の間の値で簡単な演算を行います)
For longValue = MIN_MATH To MAX_MATH Step 1
和 = longValue + 2
差 = longValue - 2
積 = longValue * 2
商 = longValue / 2
余 = longValue Mod 2
Next longValue
Next cnt
endTimer = Timer
MsgBox "Long型処理" & endTimer - startTimer & "秒"
End Sub
どちらの処理も「和差積商余」を求める5つの計算を-10000~10000の2万1種類の数をベースに計算させることを1万回ループさせる。
すなわち、5×20001×10000で10億5万回の計算を行う処理となっています。
そして、それらを10回ずつ実行し、平均処理時間を測定しました。
Integer型 | Long型 | |
2回目 | 5.625 | 5.515625 |
1回目 | 5.66796875 | 5.542969 |
2回目 | 5.625 | 5.515625 |
3回目 | 5.59375 | 5.671875 |
4回目 | 5.6875 | 5.605469 |
5回目 | 5.734375 | 5.527344 |
6回目 | 5.69921875 | 5.53125 |
7回目 | 5.69921875 | 5.761719 |
8回目 | 5.734375 | 5.699219 |
9回目 | 5.703125 | 5.71875 |
10回目 | 5.859375 | 5.734375 |
平均値 | 5.700390625 | 5.6308595 |
測定した結果、若干ではありますが、見事にLong型の方が処理時間が小さくなっていることがわかりました!
この結果には驚きです。
VBAで今後数値を定義する時は常にLong型を定義していこうかと思います。
もうちょっと調べてみたらより理解が深まる記事がありました。