前回まででDir関数・FileSystemObject・FindFirstFile関数と3種類のファイル検索を検証してみた。
今回はそれぞれの検索方法の特徴や処理速度などを比較検証してシリーズの締めくくりとしたい。
処理速度
まずは検索スピードについて検証してみる。
条件1
フォルダ数:39
ファイル数:7,111
内蔵HDD
主に画像ファイル
計測単位:秒
Dir関数 | FileSystemObject | FindFirstFile関数 | |
---|---|---|---|
1回目 | 0.273438 | 2.625000 | 0.062500 |
2回目 | 0.234375 | 2.632813 | 0.117188 |
3回目 | 0.281250 | 2.617188 | 0.101563 |
4回目 | 0.281250 | 2.625000 | 0.109375 |
5回目 | 0.289063 | 2.609375 | 0.101563 |
6回目 | 0.273438 | 2.640625 | 0.085938 |
7回目 | 0.250000 | 2.625000 | 0.101563 |
8回目 | 0.289063 | 3.007813 | 0.101563 |
9回目 | 0.250000 | 2.703125 | 0.109375 |
10回目 | 0.273438 | 2.734375 | 0.101563 |
平均 | 0.269531 | 2.682031 | 0.099219 |
FileSystemObjectの遅さが際立つ結果となっています。
Dir関数はFileSystemObjectの約10倍速く、FindFirstFile関数はさらに約2.7倍速いです。
条件2
フォルダ数:2,501
ファイル数:21,224
外付けHDD
主に音楽ファイル
計測単位:秒
Dir関数 | FileSystemObject | FindFirstFile関数 | |
---|---|---|---|
1回目 | 12.578125 | 0.742188 | |
2回目 | 10.750000 | 0.796875 | |
3回目 | 10.710938 | 0.734375 | |
4回目 | 10.484375 | 0.765625 | |
5回目 | 10.796875 | 0.757813 | |
6回目 | 10.937500 | 0.734375 | |
7回目 | 10.468750 | 0.726563 | |
8回目 | 10.890625 | 0.726563 | |
9回目 | 10.882813 | 0.726563 | |
10回目 | 11.093750 | 0.804688 | |
平均 | 10.959375 | 0.751563 |
条件1の時程の差はありませんが、それでも約14倍FindFirstFile関数が速いです。
ファイルの全体検索なんて何回も実行するものでもないので多少の速度差は目をつぶってもいいかなとは思いますが、ここまで差が開くと速い方を使いたくなりますね。
ところでDir関数の欄が真っ白ですね。忘れているわけではないですよ。
実は条件2の対象フォルダ内にUnicode拡張文字を使用したフォルダが存在しています。
Dir関数はUnicode拡張文字が存在していると正常に処理を行うことが出来ません。
次は速度以外のそれぞれの特徴を検証してみたいと思います。
特徴
Dir関数 | FileSystemObject | FindFirstFile関数 | |
---|---|---|---|
事前準備 | 不要 | 参照設定 | 宣言セクションでの宣言 |
Unicode文字検索 | 不可 | 可能 | 可能(Unicode版なら) |
ファイル・フォルダ判定 | 必要 | 不要 | 必要 |
まとめ
FileSystemObjectは多機能ですが、FindFirstFile関数に比べてかなり処理速度が遅いです。 (※Dir関数は速いですが処理できないファイルがある点が致命的欠点でパス
機能不足に関してはFindFirstFile関数をクラスに内包して機能を追加してやることである程度回避できるのではないかと考えています。(※機能を追加することで速度が落ちるかもしれないが
個人的にはFindFirstFile関数推しで、今後は使い勝手を考えていきたいと思います。