我正在使用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,则此保证不再有效。
所以我建议,在任何其他情况下,你不能依赖它。