我发现以下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);
答案 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中。如果你等待足够长的时间,缓存将刷新,你将不得不再次点击磁盘。
或者有时您可能同时运行其他一些磁盘密集型任务,但有时您在运行代码时却没有。