Integer型とLong型はどちらを使うべき?
VBAで整数を扱う型には、『Integer型』と『Long型』があります。
Integer型が扱える数字の範囲は、-32,768 ~ +32,767 です。
Long型が扱える数字の範囲は、-2,147,483,648 ~ +2,147,483,647 です。
上記範囲を超えた数字を設定しようとすると、オーバーフローを起こし、コンパイルエラーとなってしまいます。
Long型であれば許容範囲が広いので、オーバーフローはしないでしょうが、メモリのことを考えると無駄な領域は確保したくない、というのがプログラマの考えるところでしょうか。
さて今回は、この二つの整数型について、どちらを使用すればいいかを、性能の見地から検証をしてみたいと思います。
Int型 サンプルプログラム
Sub int型()
Const INT_MAX As Integer = 32767
Const INT_MIN As Integer = -32768
Dim i As Integer
Dim 和 As Integer
Dim 差 As Integer
Dim 積 As Integer
Dim 商 As Integer
Dim 余 As Integer
Dim cnt As Integer
' 計測値が少ないので余計にループ(100回)させます。
For cnt = 0 To 99 Step 1
' int型が扱える範囲分ループをします。
For i = INT_MIN - 1 To INT_MAX - 1 Step 1
和 = i + 1
差 = i - 1
積 = i * 1
商 = i / 1
余 = i Mod 1
Next i
Next cnt
End Sub
Integer型が取りうる範囲である -32,768 ~ +32,767 まで、ループを行っています。
ループ内では、四則演算および余りを計算しています。
また、今回は処理速度が速いため、100回ほど余計にループさせています。
Long型 サンプルプログラム
Sub long型()
Const INT_MAX As Long = 32767
Const INT_MIN As Long = -32768
Dim l As Long
Dim 和 As Long
Dim 差 As Long
Dim 積 As Long
Dim 商 As Long
Dim 余 As Long
Dim cnt As Long
' 計測値が少ないので余計にループ(100回)させます。
For cnt = 0 To 99 Step 1
' int型が扱える範囲分ループをします。
For l = INT_MIN - 1 To INT_MAX - 1 Step 1
和 = l + 1
差 = l - 1
積 = l * 1
商 = l / 1
余 = l Mod 1
Next l
Next cnt
End Sub
Long型のサンプルも、Integer型と同様、-32,768 ~ +32,767 までのループを行っています。
これは、処理の実行回数を同じにするためです。
後は、Integer型と同様の処理を行っています。
検証
上記2つのパターンについての実行結果は次の通りです。
回数 | Int型 | Long型 |
---|---|---|
1回目 | 1.208 | 0.936 |
2回目 | 1.209 | 0.946 |
3回目 | 1.206 | 0.939 |
4回目 | 1.204 | 0.938 |
5回目 | 1.202 | 0.936 |
6回目 | 1.200 | 0.931 |
7回目 | 1.213 | 0.932 |
8回目 | 1.303 | 0.928 |
9回目 | 1.301 | 0.926 |
10回目 | 1.295 | 0.935 |
平均 | 1.234 | 0.935 |
※単位は全て『秒』
Integer型に比べ、Long型の方が、75.77%速くなっています。
大方の予想では、『速度重視(メモリ食わないので)のInteger型』、『正確さ重視のLong型(桁あふれしないので)』、だったはずです。
それではなぜLong型の方が速い結果になったのでしょうか。
それは、両者のメモリの格納領域によります。
解説
Visual Basicにおいて、Integer型は2byte(16bit)領域に格納されます。
また、Long型は4byte(32bit)領域に格納されます。
さて、最近のCPUは、32bitのものがほとんどです。※これは2010年の記事です。
(かくいう今回検証に使用したPCも32bitです。)
32bitのCPUの場合、処理単位が32bit単位で行われます。
そのため、16bitのInteger型は、一度32bitに変換してから処理を行います。
このPC内部での変換により、32bit領域のLong型の方が、結果的に速くなったというわけです。
では、Integer型とLong型、いったいどちらを使用すれば良いのでしょう?
最近の電子機器類は、目覚しく進化し続けています。
Windows Vistaや、Windows 7では、64bitのCPUが一般的となってきています。
さらに、Excel2007以降では、1シートあたりの行数が65,536行から1,048,576行に増え、列数も256列から16,384列に増えています。
32,767が最大値であるInteger型には、とても扱える代物ではありません。
それらを踏まえると、Long型を使用した方が圧倒的に良いといえるでしょう。