Use*_*611 2 perl performance file-find
我有一个名为Lib的文件夹,我使用File :: Find模块搜索整个目录中的文件夹,D:\.搜索需要很长时间,如果驱动器有很多子目录,甚至需要5分钟.如何更快地搜索Lib,以便在几秒钟内完成?
我的代码看起来像这样:
find( \&Lib_files, $dir);
sub Lib_files
{
return unless -d;
if ($_=~m/^([L|l]ib(.*))/)
{
print"$_";
}
return;
}
Run Code Online (Sandbox Code Playgroud)
Sin*_*nür 20
在没有预先存在的索引的情况下搜索文件系统是IO绑定的.否则,将不存在从Windows桌面搜索locate到Windows桌面搜索的产品.
输入D:\> dir /b/s > directory.lst并观察该命令运行所需的时间.如果没有索引文件,你不应该期望击败它.
您可以做的一个主要改进是减少打印频率.如果您不打算捕获,则不小的改进是不使用捕获括号:
my @dirs;
sub Lib_files {
return unless -d $File::Find::name;
if ( /^[Ll]ib/ ) {
push @dirs, $File::Find::name;
}
return;
}
Run Code Online (Sandbox Code Playgroud)
在我的系统上,一个简单的脚本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`;
Run Code Online (Sandbox Code Playgroud)
在我的系统上在15秒内完成.
如果有机会的话还有一些其他dir.exe的%PATH%,cmd.exe"的内置dir将不会被调用.您可以使用qx! cmd.exe /c dir %HOME% /ad/b/s !以确保dir调用权限.