プログラム作成前は「Windows7の検索機能はわりと速い印象だから検索でファイル特定する処理は実用的な速度で動作するだろう」と思っていました。
検索機能とは、以下のようなヤツのことです。

実際にどれくらいの速度で動作するのか確認しました。
まず、フォルダを大量に作成するプログラムを作成しました。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<job> | |
<script> | |
fs = new ActiveXObject('Scripting.FileSystemObject') | |
L = 10 | |
階層max = 5 | |
fun = function(階層, path){ | |
var 次階層=階層+1 | |
for(var i=0; i<L ;i++){ | |
fs.FolderExists(path+i) ? 0 : fs.CreateFolder(path+i) | |
if(階層<階層max){ fun(次階層, path+i+'\\') } | |
} | |
} | |
fun(1, 'Z:\\新しいフォルダー\\') | |
</script> | |
</job> |
上記のPrgを実行した結果、以下のようになりました。

本当は10の5乗=10万個のフォルダができる筈ですが、途中でエラーが生じたため7万弱のフォルダができました。

このフォルダを対象にして、アイテム名のボタンをクリックしてみました。
(dirコマンドの開始前から終了後までの秒数を調べるようにプログラムを書き換えてあります)

結果は以下の通り
1回目 | 4600 ミリ秒 |
2回目 | 4552 ミリ秒 |
3回目 | 4616 ミリ秒 |
フォルダ数:7万弱で5秒弱…というのが問題になるかどうかは人それぞれだと思いますが、条件を変えるとどうなるのか気になりました。
まずは検索先フォルダの一番上の階層に対象ファイルを置いてみました。

結果は以下。変化ありません。dirコマンドは1つでも見つけたら中断するというものではないので、目的のものが有ろうが無かろうが関係なく、探す場所のフォルダの数によって速度が変わるものと思われます。
1回目 | 4532 ミリ秒 |
2回目 | 4658 ミリ秒 |
3回目 | 4554 ミリ秒 |
ちなみに上記のテストはRAMドライブという、SSDより高速な領域でやっていました。
SSDで同じフォルダ構成にして

試した結果は以下。
1回目 | 7284 ミリ秒 |
2回目 | 6789 ミリ秒 |
3回目 | 6722 ミリ秒 |
HDDでも同様に試した結果は以下。何故かSSDよりHDDの方が僅かに速い。
1回目 | 6368 ミリ秒 |
2回目 | 6355 ミリ秒 |
3回目 | 6278 ミリ秒 |
他の手段も試してみます。
Windowsにはwhereコマンドというものがあります。
dirコマンドとwhereコマンドを比較しているサイトが見つからなかったので、どんな違いがあるのか詳細は不明ですが、whereのオプションを見る限り、今回の用途で速度の差は出ないかもしれません……が、ものは試しです。
whereコマンドを使うようにプログラムを書き換えてテストしました。(HDDで)
1回目 | 4679 ミリ秒 |
2回目 | 4524 ミリ秒 |
3回目 | 4462 ミリ秒 |
ちょっと速いです。
Windows Searchというものがあります。
ググると「停止方法」の記事ばかりが表示されていて悪の権化のように嫌われているかのように見えますが、試しに利用してみることにしました。
まずは普通に検索ボックスで検索します。

「インデックスが作成されていない場所~~」のところをクリックして「インデックスに追加」をクリックします。
「インデックスに追加」ボタンをクリックします。

コントロールパネル → 大きいアイコン → インデックスのオプションで以下の画面が見られます。

「○○○個のインデックスが作成されました。」の数字の部分が徐々に増えていきます。
結構時間がかかります。わたしはこの記事を作成しながら完了を待ちました。
実際にWindows Searchを使う場合は検索する直前にインデックスを作成するのではなく、検索用フォルダとして設定しているフォルダ内にファイルをどんどん保存していき、インデックス作成はCPUがアイドル状態の時にジワジワ進めておいてもらい、必要な時にサクっと検索するイメージで…
完了したら以下の表示になりました。

Windows Search用のインデックス作成がwhereコマンドの高速化に繋がるのか不明ですが、試してみました。
テスト先はHDD。インデックスの有無はwhereコマンドには関係なさそうです。
1回目 | 4506 ミリ秒 |
2回目 | 4530 ミリ秒 |
3回目 | 4538 ミリ秒 |
エクスプローラの検索ボックスで検索したら直後にファイルが表示されました。
それをコマンドラインから利用(して間接的にHTAでも利用)する方法は無いようです。。
タグからアイテム名を検索して、アイテム名から対象のアイテムへスムーズにアクセスできると良いのですが。。
アイテム名を検索ボックスにコピペして使う、というプログラムにするのはちょっと抵抗があります。。
0 件のコメント:
コメントを投稿