VBレスキュー(花ちゃん)
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ各掲示板

リンク元へ戻ります。 数学・算法・基本コード関係のメニュー
1.人に聞けないこんな事(主要プロパティについて)
2.条件判断・条件分け処理関係
3.繰り返し処理関係
4.プログラムの最適化(高速化)について
5.ちょっと便利な小技集
6.10進←→16進相互変換
7.ソート法色々
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.


4.プログラムの最適化(高速化)について
1.プログラムの最適化(高速化)
2.Moveメソッドを活用する
3.変数関係(簡単な処理でアプリの高速化につながる)
4.整数除算の場合は、\の利用を検討してください  
5.CInt or CDblの利用を検討してください
6.ループカウンター等でのLong型の使用
7.Len() 関数の利用
8.頻繁に使うプロパティの値を変数に代入する
9.IF条件節
10.[自製VB5・6アプリ高速化ツール]等のソフトを使ってチェックする
11.最適化(高速化)を検証する
12.文字列連結時の高速化

 下記プログラムコードに関する補足・注意事項 
動作確認:Windows Vista・Windows 7 (32bit) / VB6.0(SP6)
Option :[Option Explicit]
参照設定:追加なし
使用 API:
なし
その他 :
    :
このページのトップへ移動します。 1.プログラムの最適化(高速化)

次のように記入すると、無駄なアクセスの減少とプログラムの最適化につながります。

使用例
  テキストボックスの文字色と背景色を変更する場合
  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

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

このページのトップへ移動します。 2.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

このページのトップへ移動します。 3.変数関係(簡単な処理でアプリの高速化につながる)

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


精度が十分であれば倍精度よりも単精度浮動小数点型の変数を使う。

バリアント型(Variant)はこの型特有の機能が必要な場合以外使用しない。メモリ消費が大きく、処理も遅い。

各モジュールの先頭に、OptionExplicit ディレクティブを追加し宣言されていない、バリアント型の変数の使用を防ぐ


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


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


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

このページのトップへ移動します。 4.整数除算の場合は、\の利用を検討してください  

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

このページのトップへ移動します。 5.CInt or CDblの利用を検討してください

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

このページのトップへ移動します。 6.ループカウンター等でのLong型の使用

For i=1 To 1000 等のループは、16ビットの場合Integer 型の方がメモリ消費も少なくていいのですが、32ビットの場合
Integerは、16ビット型なので、32ビットに変換して処理するために処理速度が遅くなるそうです。

For i=1& To 1000& や変数に Long 型を使って下さい。

このページのトップへ移動します。 7.Len() 関数の利用

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

このページのトップへ移動します。 8.頻繁に使うプロパティの値を変数に代入する

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, )


このページのトップへ移動します。 9.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文が連続して使用される場合は最初に頻繁に現れる値を処理する
条件文を書くようにする (上記の理由と同じ)


但し、一部コードが解りづらくなったりしますので、変更する事で実行速度が高速になる場合
に利用するようにして、効果が無いような場合は理解しやすいコードを使って下さい。


このページのトップへ移動します。 10.[自製VB5・6アプリ高速化ツール]等のソフトを使ってチェックする

自製VB5アプリ高速化ツール等を使うとソースコードを読み込み自動的に解析し、不具合個所をリストしてくれる、それによって必要な個所を改善することで高速化が図れる

このページのトップへ移動します。 11.最適化(高速化)を検証する

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

  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

因みに、Windows 7 VB6.0(SP6) Intel(R) Core(TM) i3 CPU M 330 @ 2.13GHz、2133 Mhz、では。
0.717000000004191
0.077000000004773



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

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

このページのトップへ移動します。 検索キーワード及びサンプルコードの別名(機能名)
最適化 高速化 コードを短く 簡単なコード 処理が早い 実行速度 処理時間 パフォーマンス




このページのトップへ移動します。