もりさんのプログラミング手帳

教えることは、二度学ぶこと

スポンサーリンク

【ExcelVBA】Integer型 VS Long型、速いのはどっち?【Vol.2】(因縁の対決、遂に決着のとき)

f:id:excel-accounting:20180503161206p:plain:w400

昨日この記事を公開したところ、

【ExcelVBA】Integer型 VS Long型、速いのはどっち?【Vol.1】 - IT女子がお届けするオフィスワーク効率化・VBA技術紹介

Twitterのフォロワーの方から貴重なアドバイスを頂きました。

VBAはセルへの書き込み処理が遅いので、その分を無くしたほうが差がわかりやすい、とのことです。

(実際にセル書き込みをカットしただけで数秒になりました!)

再度、ノイズのない対等な条件で対戦しましょう。

本日はこの助言を踏まえて、第二弾の検証結果公開です。

(ネットで発信した情報に対して有識者から直接に助言をいただけるなんて、とても勉強になります。ありがとうございます。)

Vol.1 → Vol.2の改良点

  1. 処理内容
    • セルへの書き込み処理をなくす
    • 使用する変数の数を増やす
    • 演算処理の回数を増やす
  2. 計測回数
    • Integer型、Long型それぞれ100回ずつ
      (Integer50回→Long50回→Integer50回→Long50回で測定)
  3. 実行環境面
    • EXCEL以外のアプリケーションはすべて落とす
    • PCの電源コードは繋いでおく
    • 念のためWi-Fiは切断

※環境
Office 2016
OS:Windows10 Home 64bit
CPU:Core i5
メモリ:4GB

さぁ、満を持して、二回目の対決です。

Integer型 VS Long型比較してみましょう。


テスト

概要

・変数をいくつか用意して適当な計算をさせ、無駄に時間を消費するマクロを作成。

・「Integer型」「Long型」で各100回ずつ実行し、WindowsAPI関数のtimeGetTimeを使用して、各実行時間をミリ秒単位測定。

ソースコード

Option Explicit
Declare Function timeGetTime Lib "winmm.dll" () As Long

Sub ひたすら無駄な時間を稼ぐマクロ2()

Dim cnt As Long

Do Until cnt = 50
    
    Dim StartTime As Long
    StartTime = timeGetTime '開始時刻
    
    Call ひたすら演算処理
    
    Dim EndTime As Long
    EndTime = timeGetTime '終了時刻
    
    Debug.Print (EndTime - StartTime) / 1000
    
    cnt = cnt + 1
    DoEvents

Loop

End Sub
'*******************************************
Sub ひたすら演算処理()

'======ここのデータ型をテスト毎に書き換え======
    Dim a As Long: a = 1
    Dim b As Long: b = 2
    Dim c As Long: c = 3
    Dim d As Long: d = 4
    Dim e As Long: e = 5
    Dim f As Long: f = 6
    Dim g As Long: g = 7
    Dim h As Long: h = 8
    Dim i As Long: i = 9
    Dim j As Long: j = 10
    
    Dim tmp As Long: tmp = 100
    
    '演算繰り返し回数
    Dim n As Long: n = 10000

    'カウンタ変数
    Dim x As Long, y As Long
'=====================================

'以下、ひたすら計算
For x = 1 To n
    For y = 1 To n
            tmp = tmp + (a + b + c + d) / e + (f + g + h + i) / j - e / a
    Next y
Next x
    
End Sub

n = 10000 ^ 2 =で1憶回の無駄な計算をしてもらいました。お疲れさまです。

結果(サマリ版)

100回実行結果のサマリです。

指標 Integer型 Long型
中央値 4.17 秒 3.80 秒
最小値 4.125 秒 3.704 秒
最大値 4.218 秒 3.891 秒

やはり「Long型の勝ち」ですね

(ちなみにVariant型は31秒。遅い!)

結果(詳細版)

実行回数 Integer型 Long型 (単位:秒)
1回目 4.141 3.735
2回目 4.168 3.748
3回目 4.191 3.704
4回目 4.204 3.812
5回目 4.202 3.891
6回目 4.217 3.828
7回目 4.173 3.831
8回目 4.177 3.81
9回目 4.142 3.804
10回目 4.182 3.82
11回目 4.185 3.795
12回目 4.155 3.796
13回目 4.142 3.797
14回目 4.181 3.797
15回目 4.161 3.8
16回目 4.168 3.793
17回目 4.161 3.797
18回目 4.157 3.813
19回目 4.169 3.797
20回目 4.195 3.797
21回目 4.136 3.796
22回目 4.137 3.797
23回目 4.173 3.798
24回目 4.139 3.796
25回目 4.14 3.78
26回目 4.173 3.813
27回目 4.156 3.798
28回目 4.156 3.798
29回目 4.171 3.796
30回目 4.158 3.797
31回目 4.172 3.777
32回目 4.172 3.8
33回目 4.171 3.797
34回目 4.157 3.797
35回目 4.141 3.796
36回目 4.14 3.798
37回目 4.125 3.811
38回目 4.157 3.806
39回目 4.14 3.795
40回目 4.189 3.79
41回目 4.155 3.796
42回目 4.171 3.813
43回目 4.156 3.797
44回目 4.157 3.797
45回目 4.158 3.796
46回目 4.159 3.782
47回目 4.153 3.813
48回目 4.155 3.797
49回目 4.159 3.797
50回目 4.172 3.797
51回目 4.137 3.838
52回目 4.17 3.858
53回目 4.204 3.83
54回目 4.214 3.827
55回目 4.19 3.829
56回目 4.205 3.844
57回目 4.218 3.859
58回目 4.217 3.846
59回目 4.183 3.797
60回目 4.177 3.796
61回目 4.185 3.795
62回目 4.173 3.797
63回目 4.157 3.86
64回目 4.171 3.812
65回目 4.17 3.797
66回目 4.144 3.782
67回目 4.17 3.804
68回目 4.174 3.787
69回目 4.171 3.783
70回目 4.156 3.796
71回目 4.157 3.794
72回目 4.154 3.784
73回目 4.172 3.797
74回目 4.153 3.804
75回目 4.189 3.819
76回目 4.157 3.797
77回目 4.176 3.829
78回目 4.153 3.78
79回目 4.169 3.782
80回目 4.158 3.797
81回目 4.172 3.78
82回目 4.155 3.799
83回目 4.169 3.794
84回目 4.159 3.782
85回目 4.156 3.799
86回目 4.169 3.796
87回目 4.158 3.797
88回目 4.171 3.797
89回目 4.183 3.782
90回目 4.176 3.813
91回目 4.155 3.794
92回目 4.17 3.797
93回目 4.156 3.814
94回目 4.157 3.797
95回目 4.176 3.779
96回目 4.151 3.801
97回目 4.156 3.776
98回目 4.173 3.812
99回目 4.169 3.799
100回目 4.141 3.8

Vol.2 まとめ

VBAの整数値はLong型で統一してよい

スポンサーリンク