Top / プログラミングテクニック / 13.参照回数を減らす

オブジェクトに対しては、参照回数を減らすべきです。
次のコーディングは、Oracle Object For OLE を使って、EMP テーブルの ENAME フィールドを読み込んで、リストボックスに格納するコーディング例です。

(1) まったく考慮しない

   Dim En As Object
   Dim DB As Object
   Dim pRec As Object
   Set En = CreateObject("OracleInProcServer.XOraSession")
   Set DB = En.OpenDatabase("ORCL.world", "Scott/Tiger")
   Set pRec = DB.CreateDynaset("SELECT ENAME FROM EMP")
   Do Until pRec.Eof
       List1.AddItem pRec![ENAME].Value    ’ダイナセットから、参照
       pRec.MoveNext
   Loop

(2) フィールドオブジェクトへの参照を、オブジェクト変数に、いったん代入

   Dim En As Object
   Dim pRec As Object
   Dim pFil As Object
   Set En = CreateObject("OracleInProcServer.XOraSession")
   Set DB = En.OpenDatabase("ORCL.world", "Scott/Tiger")
   Set pRec = DB.CreateDynaset("SELECT ENAME FROM EMP")
   Set pFil = pRec![ENAME]            ’フィールド への参照を、いったんオブジェクト変数に格納
   Do Until pRec.Eof
       List1.AddItem pFil.Value             ’格納したオブジェクト変数から値を求める
       pRec.MoveNext
   Loop

圧倒的に、(2) のほうが速くなります。 (500件くらいのデータを試してみましたが、10倍もの差がでました。)

これは、(1) が、フィールドオブジェクトへの参照を解決しながら実行されるのに対し、(2) は、解決された状態で実行されるからです。
私も、知識としてはあったのですが、まさか、10倍もの差がでるとは思っていませんでした。

マニュアルにも、「こうすれば、速くなる」としかかかれておらず、「こうすれば、これくらい速くなる」という記述がないのは残念なことです。




トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2009-10-25 (日) 23:55:55 (2920d)