#30 | モジュールのコンパイルと実行速度の関係 | |||||||||||||||||||||||||||||
一般的に「コンパイル」というと、人間に認識できるテキスト形式のソースコードを、中間形式のオブジェクトファイルに変換するという処理を指します。そして、その後「リンク」という処理を行い、EXE形式のファイルを生成するというのがコンパイラ言語の開発作業の流れになります(VBやDelphiなどの開発環境ではそれらを意識することなく、”実行”することによって一連の処理が行われますが)。しかし、Accessのモジュールでいうところのコンパイルは、それとは内容が異なっているようです。コンパイルを行ったからといって、エクスプローラで見られるような何らかのファイルが生成されるわけでもなく、またコンパイルをしないでもプログラムはそのまま走ってしまいます。つまり、開発者はコンパイルという作業手順をまったく意識しなくても済んでしまうのです。 Sub test() Dim dbs As Database Dim rst As Recordset Dim dblCurTimer As Double Dim dblResult As Double Dim ilngLoop As Long dblCurTimer = Timer 'ひたすらレコード移動を行う Set dbs = CurrentDb Set rst = dbs.OpenRecordset("入出庫明細") With rst For ilngLoop = 1 To 500 Do Until .EOF .MoveNext Loop .MoveFirst Next ilngLoop .Close End With 'ひたすら数値演算を行う For ilngLoop = 1 To 5000000 dblResult = (Sqr(2) + Sqr(3)) / Sqr(4) dblResult = 0.12345 / 2 * 9.87654 Next ilngLoop Debug.Print "コンパイルあり-テスト結果: " & _ Format$(Timer - dblCurTimer, "0.000") End Sub さて、Access VBEのツールバーのコンパイルボタンを見れば分かるように、一度コンパイルを実行すると、すでに"コンパイル済み"ということで、そのボタンは使用不可になります。そして、コードのいずれかを編集すると、"未コンパイル"ということになり、ボタンが使用可能に替わります。そこで今回は、コードの下の方にある「コンパイルあり-テスト結果: 」の部分を、「コンパイルあり」・「コンパイルなし」というように、交互に書き換えながら実行することによってテストを進めていくことにします。つまり、まずこの部分のコードを「コンパイルなし」に書き換えて、コンパイルせずに直ちに実行します。これがコンパイルなしの実行結果となります。続いて、「コンパイルあり」に書き換えて、コンパイルを実行、続いてプロシージャを実行します。これがコンパイルありの実行結果となります。 テスト結果は次のようになりました。個々の結果を見てみると、コンパイル有り無しで常に明らかな差が出ているわけではありませんでした。時にはコンパイルありの方が速く、時には遅いこともあったのです。したがって、下表ではそれぞれの結果を昇順に並べ替え、平均値で結果を比較してみることにしました。 ご覧のように、平均値で見ると、コンパイルありの方が本当にちょっとだけの時間ですが、速く処理が行われていることが分かります。ところがそれは、10秒強の処理全体に比べればほとんど無視できる程度の時間差です。しかも、もっとも速い時は10.929と10.930で、両者にまったく違いがないのです。このことから、「コンパイルの有無はパフォーマンスに影響を与えない」と断言してもよいのではないでしょうか?。Accessの特徴として、コンパイルしないで実行すると、ツールバーのコンパイルボタンが使用不可になります。おそらく実行とともに部分的なコンパイルが行われるためかもしれません。その瞬間的な時間だけが上記の差として現れていると考えられます。 結論として、Accessの「コンパイル」というものは、パフォーマンスには影響はなく、プログラム実行前の事前のエラーチェック機能程度として考えてよさそうです。 |
||||||||||||||||||||||||||||||
|
Copyright © T'sWare All rights reserved |