検索速度の測定 再び……

検索速度の測定再び……

前回

akashi-keirin.hatenablog.com

ご紹介したように、UsedRangeまわりのExcelの挙動について重大な思い違いをしていたことに気付いた私は、心を入れ替えて実験をし直すことにした。

実験環境の再整備

まず、イミディエイト・ウインドウ上で

Activesheet.Range(Activesheet.Cells(1 ,1),Activesheet.Cells(1000, 1000)).Value = "hoge"

を実行し、

f:id:akashi_keirin:20190119101429j:plain

このような環境とした。

続けて、

f:id:akashi_keirin:20190119101443j:plain

このように、ALL1000セルに「ち~んw」という値(笑)を入力した。

これで、実験環境は整った。

念のために、イミディエイト・ウインドウ上で

  • ?Activesheet.UsedRange.Address
  • ?Activesheet.UsedRange.Count
  • ?Activesheet.UsedRange.Cells.Count

これらのコードを実行し、結果を見てみる。

f:id:akashi_keirin:20190119101454j:plain

うむ。UsedRangeプロパティが1000×1000の範囲になっておる!

この状態で、前回記事のリスト1を実行する。

実行結果

まず、

f:id:akashi_keirin:20190119101505j:plain

この状態、すなわちALL1001セルにカーソルを置いた状態で実行してみる。

結果は、

f:id:akashi_keirin:20190119101516j:plain

このとおり。

1000×1000のセル範囲のセルのValueプロパティを一つ一つ調べる方式

5.343秒。

1000×1000のセル範囲のRangeオブジェクトのValueプロパティの値を一旦二次元配列にぶち込んで、同じく一つ一つ調べる方式

1.563秒。

1000×1000のセル範囲に対してExcelFindメソッドを使う方式

0.844秒。

結局、〈総ナメ>2次元配列>Findメソッド〉という順序は変わっていない。

次に、

f:id:akashi_keirin:20190119101529j:plain

この状態、すなわちALL1000セルにカーソルを置いた状態で実行してみる。

結果は、

f:id:akashi_keirin:20190119101541j:plain

このとおり。

1000×1000のセル範囲のセルのValueプロパティを一つ一つ調べる方式

4.813秒。

1000×1000のセル範囲のRangeオブジェクトのValueプロパティの値を一旦二次元配列にぶち込んで、同じく一つ一つ調べる方式

0.906秒。

1000×1000のセル範囲に対してExcelFindメソッドを使う方式

0.891秒。

やはり、〈総ナメ>2次元配列>Findメソッド〉という順序は変わっていない。

最後に、

f:id:akashi_keirin:20190119101559j:plain

この状態、すなわちA1セルにカーソルを置いた状態で実行してみた。

結果は、

f:id:akashi_keirin:20190119101618j:plain

このとおり。

1000×1000のセル範囲のセルのValueプロパティを一つ一つ調べる方式

4.797秒。

1000×1000のセル範囲のRangeオブジェクトのValueプロパティの値を一旦二次元配列にぶち込んで、同じく一つ一つ調べる方式

1秒。

1000×1000のセル範囲に対してExcelFindメソッドを使う方式

0.921秒。

やはり、〈総ナメ>2次元配列>Findメソッド〉という順序は変わらなかった。

おわりに

通常、このようなテストは、何回も繰り返して平均を取るとかするものなので、実験結果に大した意味はないと思いますが、一つ一つのセルにアクセスする方式が論外なのはともかく、2次元配列総ナメ方式とFindメソッド方式なら、平均すれば2次元配列総ナメ方式が速度面では有利だと思いました。

今回の実験のやり方だと、総ナメ方式には不利(値発見=Forループ完走なので。)だもんね。