変数の型の最適化

いきなりですが、VBは遅いです。
もともと遅いのに遅いコードを書けばさらに遅くなってしまいます。
というわけで、少しでも早いソフトを作りたいと思いませんか?
今回は、変数の型をいじるだけで高速化させる方法を書きます。

あくまでも、何万回もループさせたらの話です。
ちょっとした、演算でいちいちやるのはめんどくさい!と考えると思います。
しかし、例えばテキストエディタのようにたくさんの文字列を扱う場合・
ソートプログラムのようにたくさん演算を行う場合は結構変わってきます。
まあ、自分のプログラムを最高のものにしたいっていうのが最もですが・・・。

さてさて、本題!
VBではOption Explicitと書かない限り、変数を宣言しなくても動きます。
このとき、かってにVariant型で変数が作られてしまうのです。
この、Variant型が遅いのです。
だから、Dimなどを使って変数の型をちゃんと指定して宣言してください。
変数の型によってどれぐらいスピードが違うのか調べてきました。
下の表は適当な計算を何万回もループさせたときのかかった時間です。

変数名 変数の範囲 サイズ かかった時間(ミリ秒)
Byte 0〜255 1バイト 約443
Boolean True,False 2バイト Longより遅い
Integer -32768〜32767 2バイト 約604
Long -2147483648〜-2147483647 4バイト 約345
Variant -1.79769313486232E308〜
-4.94065645841247E-324(不の値)

-4.94065645841247E-321〜
1.79769313486232E308(正の値)
16バイト 約7525

一般的に考えて一番数の範囲が少ないByte型が早いと思われがちですが、
ByteやIntegerはLong型をわざわざ半分にしていったものなのでLong型が一番早いのです。
(最適化の詳細のチェックを全部オンにするとByte型とLong型はだいたい同じ早さになります。)
ちなみに "Dim 変数名" だけだとVariant型になってしまうので、
"Dim 変数名 As Long"のようにしてください。


さて、次は文字列を格納する変数の型です。
しかし、Variant型とString型しかないので、どれが早いか分かると思います。

変数名 変数の範囲 サイズ かかった時間(ミリ秒)
String 1バイト〜2ギガバイト 10バイト + 文字列の長さ 約7188
Variant String型と同じ 22バイト + 文字列の長さ 約9560

やはり、String型が一番早いですね。
Variant型は遅いし、メモリもたくさん使ってしまう。
とにかく、Variant型は使うな!とゆ〜ことです。



まあ、これを参考にプログラミングしてくれたら私(KAZUu)はうれしいですぅ。
ちなみに、時間測定はAPI(GetTickCount)を使いました。

余談:String型は、代入する文字列の字数が常に同じで分かっているのなら字数を固定した方が早いです。
    まあ、この辺は上級者?がすること?なので僕はよく分かりません。
    特に、字数が固定していない場合NULL文字をわざわざ取り除かなければ行けないので、めんどくさいです。

時間測定プログラムの残骸のダウンロード(ソース付き 当たり前)

ダウンロード(8.62KB)