プログラムの最適化 |
プログラムの最適化(高速化) | |
次のように記入すると、無駄なアクセスの減少とプログラムの最適化につながります。 使用例 テキストボックスの文字色と背景色を変更する場合、 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