如何优化这个Perl文件?

如何优化这个Perl文件?,perl,file-find,Perl,File Find,要求:获取输入目录下符合以下条件的目录数 目录可以有除“DIR1”、“DIR2”、“DIR3”等以外的任何名称 “DIR1”、“DIR2”、“DIR3”等目录中的目录不需要计数 只需要目录数,没有文件 这段代码提供了所需的输出,但需要花费相当多的时间 请建议改进此代码以减少所需时间的方法。可以完全跳过整个分支 use warnings; use strict; use File::Find::Rule; my $start_dir = shift || '.'; my $re_skip =

要求:获取输入目录下符合以下条件的目录数

  • 目录可以有除“DIR1”、“DIR2”、“DIR3”等以外的任何名称
  • “DIR1”、“DIR2”、“DIR3”等目录中的目录不需要计数
  • 只需要目录数,没有文件
  • 这段代码提供了所需的输出,但需要花费相当多的时间

    请建议改进此代码以减少所需时间的方法。

    可以完全跳过整个分支

    use warnings;
    use strict;
    
    use File::Find::Rule;
    
    my $start_dir = shift || '.';
    
    my $re_skip = qr/DIR(?:1|2|3)/;
    
    my $ok   = File::Find::Rule->directory;  # add selection rules as needed
    my $skip = File::Find::Rule->directory
        ->name(qr/$re_skip/)
        ->prune
        ->discard; 
    
    my @dirs = File::Find::Rule -> any($skip, $ok) -> in($start_dir); 
    
    print "Total: ", scalar @dirs, "\n";
    
    对于大型文件系统,这仍然需要一些时间,但会更好

    在一行中,如果您只需要快速计数

    perl -MFile::Find::Rule -wE'
        $ffr = File::Find::Rule; 
        $skip = $ffr->directory->name(qr/DIR(?:1|2|3)/)->prune->discard; 
        say scalar $ffr->any($skip, $ffr->directory)->in(".")'
    
    我整合了脚本中的一些代码


    下一步是使用多线程执行(我在这里使用
    fork
    )。对子目录进行分组,使它们的子目录数大致平衡,并在这些组上并行运行上述内容。收益将取决于您的硬件,但应该有一个很好的加速因子。

    有多少目录?我投票将这个问题作为离题题来结束,因为它是关于代码审查的,应该在@simbabque询问大约50万个文件。嗯,这是很多文件。您的正则表达式是错误的,它应该是
    $directory=~m/DIR1/
    ,而不是双引号
    “”
    。您可以将它们组合成一个模式,并在循环之外编译它<代码>我的$pattern=qr/DIR[123]/;如果$director=~$pattern,则查找…,然后将其与
    下一步一起使用。显然,您的模式更复杂,因此请相应地进行调整。可能有助于创建一个好的模式。
    File::Find
    无法修剪/跳过整个目录分支,但您可以尝试一下,谢谢@zdim!使用文件查找规则将所用时间减少了一半。。不过,还是要尝试多线程。@king很好,它应该是这样的。让我知道如果一些分叉代码会有帮助,我可以添加它。
    perl -MFile::Find::Rule -wE'
        $ffr = File::Find::Rule; 
        $skip = $ffr->directory->name(qr/DIR(?:1|2|3)/)->prune->discard; 
        say scalar $ffr->any($skip, $ffr->directory)->in(".")'