#29 Withステートメント構文の効果を調べる

結論
Withステートメントを使うと、オブジェクトに対する複数のプロパティ設定やメソッド呼び出しが高速化されるが、実用的には大差ない程度である。むしろ、コーディング(記法)としてのメリットの方が高いかもしれない。

Withステートメントは、ある同じオブジェクトに対する一連のステートメントを実行ための、フロー制御ステートメントです。ある単一のオブジェクトの複数のプロパティをまとめて変更したり、メソッドを実行するような場合、With〜End With 構文の中に、プロパティを割り当てるステートメントやメソッドを指定します。この方法を使えば、各プロパティやメソッドの前にオブジェクト名を指定する必要はありません。最初のWithステートメントの行で1度だけ指定してやればよいのです。

例えば、次のような一連のコードがあったとします。

txtData.Height = 500
txtData.Width = 500
txtData.Requery
これらはいずれも、"txtData"というオブジェクトに対して、プロパティ設定とメソッドを実行しています。これをWithステートメントを使って書き換えると次のようになります。
With txtData
  .Height = 500
  .Width = 500
  .Requery
End With
コードの行数は若干増えますが、ずいぶんスッキリした感じになると思いませんか?。個人的には、もっぱら、「今どのオブジェクトに対してプロパティを設定しているのか、メソッドを実行しているのかといったことが判別しやすいように」という目的で使っています。また、同じコード(ここでは"txtData"というオブジェクト名)を何回も繰り返し記述しなくてよいというのも、しばしば使う理由です。

しかし、書籍等では、このWithステートメントにはパフォーマンスを向上させる効果があると書かれているものもあります。そこで、プログラムを見たときの違いは一目瞭然だと思いますが、ここではその処理速度が実際どの程度違うのか、比較してみたいと思います。

今回は、フォームを使って、そこに配置されたテキストボックスに対して複数のプロパティ設定を実行するというテストを行ってみます。コマンドボタンは2つ用意されていて、それぞれのボタンをクリックすると、Withステートメントを使わない処理、Withステートメントを使った処理を実行します。コードの記述が異なるだけで、やっていることはまったく同じものです。測定された処理時間も、フォームの別のテキストボックスに表示します。
テスト用フォーム


2つのコマンドボタンそれぞれのイベントプロシージャは、次のようになっています。
Private Sub cmdTest1_Click()
'Withステートメントを使わないテスト

  Dim lngCurTimer As Long
  Dim iintLoop As Integer
  
  lngCurTimer = Timer
  For iintLoop = 1 To 1000
    テキスト0.BackColor = vbYellow
    テキスト0.Enabled = False
    テキスト0.Enabled = True
    テキスト0.FontBold = True
    テキスト0.FontItalic = True
    テキスト0.FontSize = 20
    テキスト0.ForeColor = vbRed
    テキスト0.Height = テキスト0.Height + 200
    テキスト0.Height = テキスト0.Height - 200
    テキスト0.ScrollBars = 2
    テキスト0.Value = "テスト中です!"
    テキスト0.Width = テキスト0.Width + 500
    テキスト0.Width = テキスト0.Width - 500
    テキスト0.Visible = True
  Next iintLoop

  Me!テスト結果 = Timer - lngCurTimer

End Sub

Private Sub cmdTest2_Click()
'Withステートメントを使ったテスト
  
  Dim lngCurTimer As Long
  Dim iintLoop As Integer
  
  lngCurTimer = Timer
  With テキスト0
    For iintLoop = 1 To 1000
      .BackColor = vbYellow
      .Enabled = False
      .Enabled = True
      .FontBold = True
      .FontItalic = True
      .FontSize = 20
      .ForeColor = vbRed
      .Height = .Height + 200
      .Height = .Height - 200
      .ScrollBars = 2
      .Value = "テスト中です!"
      .Width = .Width + 500
      .Width = .Width - 500
      .Visible = True
    Next iintLoop
  End With

  Me!テスト結果 = Timer - lngCurTimer

End Sub

実行結果は次のようになりました。

Withステートメントを使わない場合
Withステートメントを使わない場合のテスト結果


Withステートメントを使った場合
Withステートメントを使った場合のテスト結果


結果的に、明らかにWithステートメントを使った方が速いことが分かります。しかしながら、あくまでも1000回ものループを実行した結果ですので、実用的には大差ないといっていいでしょう。

でも、やはり、
  • コードがスッキリする
  • その部分のコードがどのオブジェクトを対象に処理しているのか分かりやすい
  • オブジェクト名を繰り返し記述する必要がない
といったコーディング(記法)上のメリットだけでも、Withステートメントを使う価値は十分にあると考えます。それでかつ、多少なりとも速いということであれば、一石二鳥ではないでしょうか。
| Index | Prev | Next |

 

Copyright © T'sWare All rights reserved