Wal*_*lly 4 perl performance stat
我正在遍历整个分区,stat()每个文件然后检查mtime,size和uid的返回值以反对散列值.stat()但是Perl的速度太慢了,我想知道是否有更快的替代品我可能会忽略.
Mic*_*man 18
当你打电话给stat你查询文件系统时,它会受到性能的限制.对于大量文件,这将是缓慢的; 它不是真正的Perl问题.
在您关闭优化统计数据之前,请使用Devel :: NYTProf查看真正的减速情况.
另外,请研究如何挂载文件系统的详细信息.是一切本地的,还是你在NFS或类似的东西上安装了什么?正如其他答案所指出的那样,有许多问题可能成为问题.在知道问题之前,不要花太多时间专注于任何潜在的问题.
祝好运,
stat正在对每个文件执行IO,如果您想要读取这些数据,这是无法避免的.所以这将是速度的限制,不能以我能想到的任何其他方式解决.
如果您反复stat使用相同的文件,请考虑使用Memoize.
use Memoize();
sub fileStat {
  my ($filename) = @_;
  return stat($filename);
}
Memoize::memoize('fileStat');
你已经看到它stat足够慢,所以不要在同一个文件上多次调用它.
-X(shell-ish文件测试运算符)上的perlfunc文档描述了一个很好的缓存stat:
如果任何文件测试(或其中之一的
stat或lstat运营商)给出由孤下划线的特殊文件句柄,然后将前一个文件测试(或统计运算符)的统计结构中,节省了系统调用.(这不工作-t,你需要记住,lstat并-l会留下值stat结构的符号链接,而不是真实的文件.)(另外,如果统计缓冲是由一个充满lstat呼叫,-T并且-B将重置结果stat _).例:Run Code Online (Sandbox Code Playgroud)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 _;
| 归档时间: | 
 | 
| 查看次数: | 2131 次 | 
| 最近记录: |