为什么我的perl代码的执行时间变化如此之大?

时间:2011-10-27 05:57:08

标签: performance perl

我发现以下perl代码以惊人的变化速度执行,有时很快,有时很慢。我有几个包含数万个文件的文件夹,我需要运行此代码。我正在使用Windows 7在cygwin上运行它。只是想知道是否有人可以帮助我加快速度,或者至少要弄清楚速度变化的原因。在所有这些情况下,我的CPU和内存都应该充足。

外部循环迭代$ dir的列表

opendir(DIR, $dir);
@all=readdir(DIR);
@files = (0..$#all);
$i=-1;
foreach $current (@all){     
    if (-f "$dir/$current") {
        $files[++$i]=$current;
    }
}
push @Allfiles,@files[0..$i];
closedir(DIR);

2 个答案:

答案 0 :(得分:7)

您可能受I / O限制,因此对代码的更改可能不会影响总运行时间 - 运行时将受目录条目是否在缓存中的影响。

但是你的代码使用临时数组是没有充分理由的,如果目录非常大,使用太多RAM。您可以将其简化为:

opendir(DIR, $dir);
while (my file = readdir(DIR)) {
    push @Allfiles, $file if (-f "$dir/$file");
}
closedir(DIR);

没有临时数组。

答案 1 :(得分:4)

如果第一次运行时速度很慢,并且在此之后很快,则问题是您的系统正在缓存读取。第一次运行代码时,必须从磁盘上读取数据。之后,数据仍然缓存在RAM中。如果你等待足够长的时间,缓存将刷新,你将不得不再次点击磁盘。

或者有时您可能同时运行其他一些磁盘密集型任务,但有时您在运行代码时却没有。