是否有更快的替代Perl的统计数据?

时间:2010-01-07 21:01:07

标签: performance perl stat

我遍历整个分区,stat()'查找每个文件,然后根据哈希值检查mtime,size和uid的返回值。 stat()然而在Perl中速度太慢了,我想知道是否有更快的替代方案我可能会忽略。

6 个答案:

答案 0 :(得分:18)

当您致电stat时,您正在查询文件系统,并且会受到其性能的限制。对于大量文件,这将是缓慢的;它不是真正的Perl问题。

答案 1 :(得分:8)

在您开始优化stat之前,请使用Devel::NYTProf查看真正减速的位置。

另外,请研究如何安装文件系统的详细信息。是一切本地的,还是你在NFS或类似的东西上安装了什么?正如其他答案所指出的那样,有许多问题可能成为问题。在你知道问题之前,不要花太多时间专注于任何潜在的问题。

祝你好运,

答案 2 :(得分:6)

stat正在对每个文件执行IO,如果您想要读取这些数据,这是无法避免的。所以这将是速度的限制,不能以我能想到的任何其他方式解决。

如果您反复stat使用相同的文件,请考虑使用Memoize

use Memoize();

sub fileStat {
  my ($filename) = @_;
  return stat($filename);
}

Memoize::memoize('fileStat');

答案 3 :(得分:6)

您已经看到stat已经足够慢了,所以不要在同一个文件上多次调用它。

perlfunc documentation on -X(shell-ish文件测试运算符)描述了stat的一个很好的缓存:

  

如果任何文件测试(或statlstat运算符)被赋予由单独下划线组成的特殊文件句柄,那么前一个文件测试(或stat运算符)的stat结构)使用,保存系统调用。 (这不适用于-t,您需要记住lstat-l会在符号链接的统计结构中保留值,而不是真实文件。)(另外,如果统计缓冲区被lstat调用填充,-T-B将使用stat _的结果重置它。例如:

print "Can do.\n" if -r $a || -w _ || -x _;
stat($filename);
print "Readable\n" if -r _;
print "Writable\n" if -w _;
print "Executable\n" if -x _;
print "Setuid\n" if -u _;
print "Setgid\n" if -g _;
print "Sticky\n" if -k _;
print "Text\n" if -T _;
print "Binary\n" if -B _;

答案 4 :(得分:-3)

  • 如果您使用* NIX,您可以使用ls并解析输出,我应该想一想。
  • 正如以太提到的那样,find可能是一个很好的选择,如果你只是想对你的统计数据作出决定。
  • 但是大小,日期和uid都应该从ls输出中获得。
  • 虽然Windows平台上的dir命令可以使用日期和大小。

答案 5 :(得分:-3)

考虑File::Find模块。