【问题标题】:perl File::Find and _perl 文件::查找和_
【发布时间】:2019-12-13 17:34:48
【问题描述】:

我正在使用File::Find 浏览大量文件,然后根据它们的大小、年龄等进行清理。我通过 Windows 网络共享访问这些文件,因此统计调用很昂贵

代码看起来像这样

sub findItems
{
  my $item = $File::Find::name;
  my $dir  = $File::Find::dir;
  my $itemName = $_;

  if    (-f $item) { .. }
  elsif (-d $item) { .. }

  my $age = -M $item;
  my $size = -s $item;

发现这需要很多时间。罪魁祸首是-f/-d-M-s 的3 个电话,都需要一个新的stat。所以我把它改成了

sub findItems
{
  my $item = $File::Find::name;
  my $dir  = $File::Find::dir;
  my $itemName = $_;

  if    (-f $item) { .. }
  elsif (-d $item) { .. }

  my $age = -M _;
  my $size = -s _;

当我从 4 个stat 调用到 2 个时,这几乎将时间减半。我之所以说 4,是因为我知道在 File::find 中也有一个 stat 调用,而我的代码中有 3 个。

我的问题是我可以依靠File::Find 中的stat 调用并将我的代码更改为此

sub findItems
{
  my $item = $File::Find::name;
  my $dir  = $File::Find::dir;
  my $itemName = $_;

  if    (-f _) { .. }
  elsif (-d _) { .. }

  my $age = -M _;
  my $size = -s _;

这将再次将所需时间减半。我想我将不得不实际检查File::Find 代码,看看除了$item 之外是否还有其他stat 调用

谢谢

【问题讨论】:

  • "我可以依赖File::Find 中的stat 调用" -- 可能,但我不会。仅依靠您在代码中可以看到(和控制)的内容只是另外一个调用,对吗?不妨明确调用stat(或File::stat)以预先检索您需要的所有内容。

标签: perl stat


【解决方案1】:

基于its documentation,“保证在调用用户的wanted() 函数之前已经调用了lstat。这可以实现涉及_的快速文件检查。请注意,此保证不再如果未设置 follow 或 follow_fast 则保持。"

所以我建议,在任何其他情况下,你都不能依赖它。

【讨论】:

    猜你喜欢
    • 2017-01-10
    • 2016-06-08
    • 2013-07-19
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多