2009年4月17日金曜日

[他]ReDim神話?

最近、VB6.0の修正案件があり、コードを見ているとReDimをしている箇所がいくつかありました。それを見て、遠い昔に「VBのReDimは非常に遅いのでReDimが1回ですむように、先に必要な要素を確保するのが定石。ループ内でReDimするなどもってのほか。」と聞いたことを思い出しました。
パフォーマンス改善も案件の1つであったため、ついでに直しておきました。で、計測してみたんですが、変わったのは誤差レベルでした。
はて?と思い、VBSで以下のようなコードを試しに実行してみました。

Dim data()
Dim idx

Dim st
st = Timer

For idx=0 to 100000
    ReDim Preserve data(idx)
    data(idx) = "Data" & idx
Next

MsgBox "処理時間=" & (Timer - st) * 1000 & " ms"


で、ループ回数を変えて実行してみました(C2D 2GHz環境)

1,000 → 処理時間= 0.0 ms
10,000 → 処理時間= 14.9 ms
100,000 → 処理時間= 530.0 ms
1,000,000→ 処理時間=46,939.9 ms


指数的にパフォーマンスは悪化しますが、数万のレベルであれば数十ミリ秒のレベル。
いまどきのハードであれば、処理のわかりやすさ重視でいいのかもしれませんね。

0 件のコメント: