【发布时间】: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)以预先检索您需要的所有内容。