変数で整数を扱うものとして,整数型(Integer)と長整数型(Long)があります。
記憶領域や扱える範囲は,以下の通りです。
データ型 | 記憶領域 | 範囲 |
整数型(Integer) | 2バイト | −32,768〜32,767 |
長整数型(Integer) | 4バイト | −2,147,483,648〜2,147,483,647 |
私が扱うマクロでは,整数値で30000もあれば事足りるので,何の疑問もなくInteger型を使ってきました。
しかし,先日,マクロを介して知り合ったT氏から,「32ビットなら,Integer型よりLong型の方が処理が速いよ。」との
アドバイスをいただきました。
そこで,実際に実験して調べてみることにしました。
速度を調べるマクロは,HP「VBA性能向上委員会」で処理速度の比較をしている記事があったので,
私も同じものを使って検証することにしました。 ※著作権等で問題があれば,お知らせ下さい。
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 Dim S As Single Dim G As Single Dim R As Integer For R = 2 To 11 S = Timer For cnt = 1 To 1000 For i = INT_MIN + 1 To INT_MAX - 1 和 = i + 1 差 = i - 1 積 = i * 1 商 = i / 1 余 = i Mod 1 Next i Next cnt G = Timer Cells(R, 2) = G - S Next R MsgBox "Finish!" End Sub |
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 Dim S As Single Dim G As Single Dim R As Long For R = 2 To 11 S = Timer For cnt = 1 To 1000 For l = INT_MIN + 1 To INT_MAX - 1 和 = l + 1 差 = l - 1 積 = l * 1 商 = l / 1 余 = l Mod 1 Next l Next cnt G = Timer Cells(R, 3) = G - S Next R MsgBox "Finish!" End Sub |
・マクロは,変数の宣言を変えた以外は,まったく同じです。 ・計算の範囲は,Integer型で扱える範囲の下限から上限までにし,それでもかかる時間が短いため,それを1000回繰り返す処理にしました。 ・正確なデータを取るため,Timer関数を使って10回測定し,結果をワークシートに書き込むようにしました。(AVERAGE関数は,処理が終わった後に,書き込みました。 ) |
2020年に,もう一度,実験してみました。
すると,どちらもLong型の方が,処理速度が速かったです。
これからは,整数はLong型の方がよさそうですね。
A | B | ||||
Integer型 | Long型 | Integer型 | Long型 | ||
1回目 | 2.828125 | 2.828125 | 1回目 | 14.26171875 | 13.7421875 |
2回目 | 2.90625 | 2.91015625 | 2回目 | 14.25390625 | 13.73046875 |
3回目 | 3.015625 | 2.765625 | 3回目 | 14.2265625 | 13.73046875 |
4回目 | 3.015625 | 2.703125 | 4回目 | 14.21875 | 13.71875 |
5回目 | 2.890625 | 2.71875 | 5回目 | 14.23046875 | 13.73828125 |
6回目 | 2.921875 | 2.828125 | 6回目 | 14.21484375 | 13.73046875 |
7回目 | 2.84375 | 2.84375 | 7回目 | 14.25 | 13.73828125 |
8回目 | 2.828125 | 2.76953125 | 8回目 | 14.25 | 13.7578125 |
9回目 | 2.890625 | 2.765625 | 9回目 | 14.24609375 | 13.734375 |
10回目 | 2.984375 | 2.796875 | 10回目 | 14.23046875 | 13.734375 |
平均 | 2.9125 | 2.792969 | 平均 | 14.23828 | 13.73555 |
OS | Windows10 | OS | Windows10 | ||
CPU | Core i7 | CPU | Pentium | ||
2.93GHz | 2.16GHz | ||||
メモリ | 8.00GB | メモリ | 4.00GB | ||
システム | 64Bit | システム | 64Bit | ||
Excel | 2016 | Excel | 2016 | ||
32bit版 | 32bit版 | ||||
結果 | ○ | 結果 | ○ |
--------以下の実験は,2014年の記事です。--------
ワークシートに時間を書き込んで,一覧にしたものが以下の表です。
A | B | C | D | ||||||||
Integer | Long | Integer | Long | Integer | Long | Integer | Long | ||||
1回目 | 2.84375 | 3.671875 | 1回目 | 4.9609375 | 5.0390625 | 1回目 | 5.0078125 | 4.49609375 | 1回目 | 7.54296875 | 6.1640625 |
2回目 | 2.8046875 | 3.609375 | 2回目 | 4.9140625 | 4.9921875 | 2回目 | 4.90234375 | 4.32421875 | 2回目 | 7.46875 | 6.171875 |
3回目 | 2.828125 | 3.6015625 | 3回目 | 4.8828125 | 4.9921875 | 3回目 | 4.9765625 | 4.49609375 | 3回目 | 7.4375 | 6.17578125 |
4回目 | 2.8203125 | 3.6640625 | 4回目 | 4.9453125 | 4.9609375 | 4回目 | 4.79296875 | 4.3671875 | 4回目 | 7.453125 | 6.17578125 |
5回目 | 2.8046875 | 3.5859375 | 5回目 | 4.9140625 | 4.9765625 | 5回目 | 4.87109375 | 4.55859375 | 5回目 | 7.4375 | 6.17578125 |
6回目 | 2.890625 | 3.6171875 | 6回目 | 4.8515625 | 4.9609375 | 6回目 | 4.8828125 | 4.33984375 | 6回目 | 7.41015625 | 6.17578125 |
7回目 | 2.8671875 | 3.5859375 | 7回目 | 4.9453125 | 4.9921875 | 7回目 | 4.90234375 | 4.37109375 | 7回目 | 7.4375 | 6.17578125 |
8回目 | 2.8203125 | 3.703125 | 8回目 | 4.9765625 | 4.9765625 | 8回目 | 4.9609375 | 4.3046875 | 8回目 | 7.421875 | 6.17578125 |
9回目 | 2.8359375 | 3.6875 | 9回目 | 4.8515625 | 5.0390625 | 9回目 | 5.02734375 | 4.43359375 | 9回目 | 7.421875 | 6.20703125 |
10回目 | 2.90625 | 3.59375 | 10回目 | 4.8828125 | 5.0390625 | 10回目 | 4.90234375 | 4.32421875 | 10回目 | 7.4375 | 6.171875 |
平均 | 2.8421875 | 3.63203125 | 平均 | 4.9125 | 4.996875 | 平均 | 4.92265625 | 4.4015625 | 平均 | 7.446875 | 6.176953125 |
対比 | 78% | 128% | 対比 | 98% | 102% | 対比 | 112% | 89% | 対比 | 121% | 83% |
OS | Windows7 | OS | Windows7 | OS | Vista Business | OS | XP | ||||
CPU | Core i7 | CPU | Core 2 Duo | CPU | Core 2 Duo | CPU | Celeron M | ||||
2.93GHz | 2.10GHz | 2.40GHz | 1.73GHz | ||||||||
メモリ | 8.00GB | メモリ | 2.00GB | メモリ | 2.00GB | メモリ | 1.99GB | ||||
システム | 64Bit | システム | 32Bit | システム | 32Bit | システム | 32Bit | ||||
Excel | 2010 | Excel | 2007 | Excel | 2007 | Excel | 2002 | ||||
32bit版 | 32bit版 | 32bit版 | 32bit版 | ||||||||
結果 | Integer | 結果 | Integer | 結果 | Long | 結果 | Long |
この結果を見る限りでは,古い機種だとそうなるということですかね。
AとBはうちのシステムなので,うちでは今まで通りInteger型を使っていくことになります。
また,ネットでいろいろと調べてみると,ここでわずかな時間を気にするよりも,もっと大きく時間を詰めることのできる部分が他にあるはずなので,
処理の仕方や順番などで改良した方が,より処理時間を短くできるだろうとのことでした。私もそう思います。
今回の実験で不思議に思ったのは,BとCが同じCPUで,32ビットパソコンで,エクセルのバージョンも同じなのに,結果が違ってきていること。
原因として残るのは,OSの違いくらいなんだけれど,そういうことってあるんですかね。