既存のインデックスなしでファイルシステムを検索することは、IOバウンドです。locate
そうしないと、Windowsデスクトップ検索に至るまでの製品が存在しません。
D:\> dir /b/s > directory.lst
そのコマンドの実行にかかる時間を入力して観察します。最初にファイルにインデックスを付けることなしにそれを打ち負かすことを期待するべきではありません。
できる大きな改善点の1つは、印刷の頻度を減らすことです。マイナーな改善点は、キャプチャする予定がない場合は、キャプチャ括弧を使用しないことです。
my @dirs;
sub Lib_files {
return unless -d $File::Find::name;
if ( /^[Ll]ib/ ) {
push @dirs, $File::Find::name;
}
return;
}
File::Find
私のシステムでは、ホームディレクトリの下にあるすべてのサブディレクトリの名前を約150,000ファイルで印刷するために使用する単純なスクリプトは、実行に数分かかりますdir %HOME% /ad/b/s > dir.lst
。これに対して、約20秒で完了します。
私は使用する傾向があります:
use File::Basename;
my @dirs = grep { fileparse($_) =~ /^[Ll]ib/ }
split /\n/, `dir %HOME% /ad/b/s`;
私のシステムでは15秒以内に完了しました。
dir.exe
に他の何かがある可能性がある場合%PATH%
、cmd.exe
のビルトインdir
は呼び出されません。を使用qx! cmd.exe /c dir %HOME% /ad/b/s !
して、権利dir
が呼び出されていることを確認できます。