プログラムの最適化
                                                        玄関へお回り下さい。
プログラムの最適化(高速化)
   次のように記入すると、無駄なアクセスの減少とプログラムの最適化につながります。

使用例
  テキストボックスの文字色と背景色を変更する場合、
  Text1.BackColor = RGB(255,255,100)
  Text1.ForeColor = RGB(100,100,100)

通常は上記のようにプログラムしますが、次のように記入するとオブジェクトの呼び出しが1回で済むためプログラムの実行速度が向上につながります。

  With Text1
    .BackColor = RGB(255,255,100)
    .ForeColor = RGB(100,100,100)
  End With

このように、オブジェクトの呼び出しが何回もあるようなプログラムはこの様にちょっとしたことでも全体の実行速度向上につながりますのぜひ工夫してみて下さい。

Moveメソッドを活用する
   普通フォーム等にサイズや表示位置の設定・変更は下記のように書きますが
Private Sub Form_Load()
  Form1.Left = 0
  Form1.Top = 0
  Form1.Width = 8630
  Form1.Height = 4500
End Sub

Moveメソッドを使用すると1行で済みますし、高速化につながります。
Private Sub Form_Load()
  Form1.Move 0, 0, 8630, 4500
End Sub

変数関係(簡単な処理でアプリの高速化につながる)
   できるだけ整数型(Integer)と長整数型(Long)の変数を使う。整数型の演算処理はCPUへの命令が一回だけなのでSingelやDoubleに比べはるかに高速でメモリ消費も少なくてすむ。

精度が十分であれば倍精度よりも単精度浮動小数点型の変数を使う
バリアント型(Variant)はこの型特有の機能が必要な場合以外使用しない。メモリ消費が大きく、処理も遅い。
各モジュールの先頭にOptionExplicitディレクティブを追加し宣言されていない、バリアント型の変数の使用を防ぐ

プロシージャで静的なローカル変数を参照すると、通常の動的なローカル変数を参照するより、2〜3倍処理が遅くなる。プロシージャを高速にするには、静的変数をモジュールレベルの変数に変更する。

Int関数とVal関数は常に浮動小数点型の値を返すので注意が必要。
abcd%=Val(Text1.Text)よりもabcd%=Text1.Text の方が約30%高速である。

LeftやTrimなど$なし文字列関数を使わない。
これらの関数はバリアント型の値を返すから。 Left$やTrim$は文字列型を返す。

整数除算の場合は、\の利用を検討してください  
   intRc1Max = LOF(1) / Len(Myfile)  等は 
intRc1Max = LOF(1) \ Len(Myfile)  に変更して下さい

CInt or CDblの利用を検討してください
   If Val(Text20.Text) > 0 Then は浮動小数点型の値を返すので
If CInt(Text20.Text) > 0 Then 等に変更して下さい。

ループカウンター等でのLong型の使用
   For i=1 To 1000  等のループは16ビットの場合Integer 型の方がメモリ消費も少なくていいのですが、32ビットの場合Integerは16ビット型なので32ビットに変換して処理するために処理速度が遅くなるそうです。
For i=1& To 1000&  や変数にLong 型を使って下さい。

Len() 関数の利用
   If Text5.Text = "" Then より If Text5.Text = vbNullString かIf Len(Text5.Text) = 0& Then を利用するようにしてください

頻繁に使うプロパティの値を変数に代入する
   Visual Basic Books Online の中の実行速度の最適化の中のコードの最適化に下記のように書いてあります。

For i = 0 To 10
  picIcon(i).Left = picPallete.Left
Next I

このコードを次のように書き直すと、かなり高速になります。
picLeft = picPallete.Left
For i = 0 To 10
  picIcon(i).Left = picLeft
Next I

同様に、次のコード例を実行すると処理時間がかかります。
Do Until EOF(F)
Line Input #F, nextLine
  Text1.Text = Text1.Text + nextLine
Loop

このコードを次のように書き直すと、かなり高速になります。
Do Until EOF(F)
Line Input #F, nextLine
  bufferVar = bufferVar + nextLine
Loop
Text1.Text = bufferVar

ただし、次のコード例では、同じ作業がより高速に処理されます。
Text1.Text = Input(LOF(F),F, )

IF条件節
  次のようなコードの場合

  If X <> 0 Or y <> 0 Then

  次のように簡略化できる

  If X Or y Then


次のようなコードの場合

  If X = 0 And y = 0 Then

  次のように簡略化できる

  If (X Or y) = 0 Then



次のようなコードの場合

  If (X = 0 And y = 0) Or (X <> 0 And y <> 0) Then

  次のように簡略化できる

  If (X = 0) Xor (y <> 0) Then


次のようなコードの場合

  If X > 0 Then
    y = 1
  Else
    y = 0
  End If

  次のように簡略化できる

  y = -(X > 0)


何でも簡略化すればいいものでもない。たとえば次の場合


  If x > 0 And Tan(x) < 1 Then y = 1

  次のように別々のIFブロックに分割すると

  If x > 0 Then
    If Tan(x) < 1 Then y = 1
  End If

  最初のIFがFalseの場合は次のIF文が実行されないので
  その分、実行速度が速くなります。


IF文が連続して使用される場合は最初に頻繁に現れる値を処理する
条件文を書くようにする(上記の理由と同じ)


但し、一部コードが解りづらくなったりしますので、変更する事で実行速度が高速になる場合に利用するようにして、効果が無いような場合は理解しやすいコードを使って下さい。
[自製VB5・6アプリ高速化ツール]等のソフトを使ってチェックする
     自製VB5アプリ高速化ツール等を使うとソースコードを読み込み自動的に解析し、不具合個所をリストしてくれる、それによって必要な個所を改善することで高速化が図れる

最適化(高速化)を検証する
   次のプログラムを実行して見て下さい。(正確には別々にテストした方が良いのですが)

  Private Sub Command1_Click()
    Dim dblStart As Double
    Dim dblEnd As Double
    Dim i As Integer
    Dim j As Integer
    Dim strDmy As String
    dblStart = Timer
    For i = -1000 To 1000
      strDmy = ""
      For j = -1000 To 1000
        strDmy = ""
      Next j
    Next i
    dblEnd = Timer
    Debug.Print dblEnd - dblStart
    DoEvents

    dblStart = 0
    dblEnd = 0
    Dim k As Long
    Dim l As Long
    dblStart = Timer
    For k = -1000& To 1000&
      strDmy = vbNullString
      For l = -1000& To 1000&
        strDmy = vbNullString
      Next l
    Next k
    dblEnd = Timer
    Debug.Print dblEnd - dblStart
  End Sub

 結果
   3.06999999999971
   1.04000000000087
   今回のテストでは  strDmy = vbNullString の効果がほとんど(大きい)です。

   Win98 VB5.0 SP3  MMX PentiumU 300MHz

詳しくはBasic Books Online”実行速度の最適化”で検索して下さい。
コードの最適化  表示速度の最適化  ユーザーから見た実行速度の最適化  パフォーマンスの測定 最適化のテストと検証 等について書いてあります

逆も真なり、と言います。私は常に timeGetTime 関数等を使って実行速度を計測しながらコードを書くように、最近は心がけております。
計測する事で処理が多く掛かっている部分が解り、無駄なコード等が簡略化できたり、コードが見易くなったり、又新たな発見に出会ったりと、たとえば、当サイトで紹介していた StrCut という文字列処理関数がWinXPで使用すると極端に遅くなる事が解り、調べている内に新たな処理方法(fStrCut 参照)を発見したという事もありました。






2003/04/24