リロード | 新規新規 編集編集 差分差分 添付添付 バックアップバックアップ | 一覧 検索 最終更新 凍結 複製 改名 | ヘルプ | 最終更新のRSS |

 
VB6 
http://wiki.nothing.sh/355.html

█ VB6

Last-modified: 2014-12-25 (木) 00:29:39 / Short URL: http://wiki.nothing.sh/355.html / add to hatena bookmark 0 users / add to livedoor clip - users

VB6

今更ながら Visual Basic 6.0 の、他ではあまり知られてない Tips をちょっと。

コンパイル後に実行速度が遅くなる!?

普段、書いたコードを EXE にコンパイルして実行すると、特にネイティブコンパイル時は IDE で実行する時よりも高速化して嬉しいのですが、実は反対に 速度が極端に低下する状況 というのが存在します。これに気が付くのにえらく時間が掛かってしまったのですが、原因を見付けたのでここにメモっておきます。

実は、よくある エラートラップ の処理がまさしくそれで、例えば次のようなコードを実行したとします:

Dim i as Long, errCnt as Long, pObj(i) As Form

On Local Error Resume Next

For i = 0 To TESTCOUNT
    pObj(i).Caption = "a"       ' pObj(i) = Nothing なのでエラーとなる
    
    If Err.Number > 0 Then
        errCnt = errCnt + 1
        Err.Clear
    End If
Next i

うちの Athlon XP 3200+ の環境で、この単純なループを 10 万回実行したとき、

  • IDE環境内: 約 200 ms
  • コンパイル後: 約 800 ms

と、かなりの速度差が発生します。 VB ではあまり無いとは思いますが、例えばフレームレート命!なゲームを制作してるときは、これはかなり致命的な数字です

事前に防げるエラーはできる限り未然に防ぎましょう、ってことですね。

空の動的配列に LBound() / UBound() を使ってもエラーを発生させない方法

上のエラートラップ関係で、個人的によくハマったものなのですが、解決策が見つかったので。

http://homepage1.nifty.com/MADIA/vb/vb_bbs/200312_03120035.html

Private Declare Function SafeArrayAllocDescriptor Lib "oleaut32" _
  (ByVal cDims As Long, _
   ByRef ppsaOut() As Any) As Long

と宣言して、

Dim X() As Test
SafeArrayAllocDescriptor 1, X

を実行してみてください。UBound(X) が -1 になります。


(HTML conversion costs 0.017 sec.)