perl 文件::查找和 _.



我正在使用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调用任何其他内容

谢谢

根据其文档,"可以保证在调用用户的wanted((函数之前已经调用了lstat。这将启用涉及 _ 的快速文件检查。请注意,如果未设置遵循或follow_fast,则此保证不再有效。

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

最新更新