performance - 如何使 Perl 的 File::Find 更快?

标签 performance perl 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;
    }

最佳答案

在没有预先存在的索引的情况下搜索文件系统是 IO 绑定(bind)的。否则,产品范围为 locate Windows Desktop Search将不存在。

输入 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;
}

在我的系统上,一个使用 File::Find 的简单脚本与 dir %HOME% /ad/b/s > dir.lst 相比,打印包含大约 150,000 个文件的主目录下所有子目录的名称需要几分钟的时间。这在大约 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被调用。

关于performance - 如何使 Perl 的 File::Find 更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1783631/

相关文章:

css - 当您特定时,CSS 会更快吗?

sql-server - 为什么 VALUES(CONVERT(XML ,'...' )) 比 VALUES(@xml) 慢得多?

Perl 执行命令,捕获并显示输出

Perl File::Find: 先列出目录中的所有文件然后跳转到下一个目录?

perl - 文件::统计返回 "No such file or directory"

perl - 如何优化这个 Perl 文件查找?

performance - 比较2台机器的性能

从 DatePicker 中选取值后,Android setError 验证仍然显示。?

Perl kill子进程也退出父进程?

Perl - 理解 "botstrap"