如何让Perl的文件::查找速度更快?

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桌面搜索locateWindows桌面搜索的产品.

输入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调用权限.

  • 不使用捕获括号的+1 - 但总的来说,与磁盘访问时间相比,它可能是二阶效应. (4认同)