VBA性能向上委員会

VBAプログラミングの実行速度に関して、より速い性能を求めて徹底検証をします。


HOME > VBA性能徹底検証 > Integer型とLong型はどちらを使うべき?

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.2080.936
2回目1.2090.946
3回目1.2060.939
4回目1.2040.938
5回目1.2020.936
6回目1.2000.931
7回目1.2130.932
8回目1.3030.928
9回目1.3010.926
10回目1.2950.935
平均1.2340.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型を使用した方が圧倒的に良いといえるでしょう。