速度低下

 「クラスを導入すると、効率的になる」などと言われていますが、それは、人間にとっての効率化です。機械側から見ると、あまり効率的ではないこともあり、やはり実行速度は低下します。

最近のパソコンは十分に高速なので、特に何もしなくてもよいのかもしれませんが、気になる場合は、以下のような小細工を導入してみてはいかがでしょうか。

プロパティ値をキャッシュする

 ドットでオブジェクトのプロパティやメソッドにアクセスする度に、プロシージャが実行されることになります。(F8 キーで始めるステップ実行で確認してみてください。)

同じプロパティを一度に何回も読み取りアクセスする場合は、予め一回だけアクセスしてローカル変数に保持することで、無駄を省きます。

'愚直な方法。
targetA = object.propertyA
targetB = object.propertyA
targetC = object.propertyA '同じ呼び出しを何回も繰り返している。
...
'With ... End With を使えば、若干効率化される模様。
With object
    targetA = .propertyA
    targetB = .propertyA
    targetC = .propertyA 'でも、やっていることは同じ…。
    ...
End With
'アクセスを一回で済ませてしまう。
Dim targetPropertyA As ...
targetPropertyA = object.propertyA

targetA = targetPropertyA
targetB = targetPropertyA
targetC = targetPropertyA
...

もちろん、“キャッシュしたあと、値が変化しないこと”が前提になります。

オブジェクトを ByRef で渡す

 プロシージャの引数にクラス型を指定した場合、受け渡し方が ByVal 値渡しだと、数値型に比べて呼び出しに時間がかかってしまいます。ByRef 参照渡しにすると、変数のアドレスが直接渡されるので、ByVal よりも高速に呼び出すことができます。速度が欲しい場面では、ByRef にするのもひとつの方法です。

Public Property Set CurrentItem(ByVal NewValue As Item)
Public Property Set CurrentItem(ByRef NewValue As Item)

これは Variant や Object、String 型にも当てはまります。(特に String が遅いようです。)一方、Long や Integer などの数値型や列挙型の場合は、ByVal、ByRef の違いは、ほとんどありません。

ただし、参照渡しでは、呼び出されたプロシージャ側で中身を変更できるので、使い方を誤らないように注意します。

New の負担

 オブジェクトの実体を生成する New も、時間のかかる処理です。必要でなければ、New しないように心がけます。

「オブジェクト変数を宣言するときに New を修飾することで、New を Set するコードを記述しなくてもよい」という方法がありますが、

Dim myObj As New MyClass

などの理由から、極力、これは使わないようにします。

2002年11月 3日(日) 更新