我测试的哈希表包含大约70000个学院,每个学院包含大约20名学生。我尝试了5次,以下是结果。使用foreach和while(each)循环的性能存在相当大的差异。为什么会这样呢?
使用while循环的代码:
while ( my ($college_code, $college_info_hr) = each (%{$college_data_hr}) ) {
while ( my ($student_num, $student_info_hr) = each (%{$college_info_hr->{'students'}}) ) {
if($student_num < 104000) { ## Delete the info of students before 2004.
delete $college_info_hr->{'students'}{$student_num};
}
}
}
使用foreach循环的代码:
foreach my $college_code (keys %{$college_data_hr}) {
foreach my $student_num (keys %{$college_data_hr->{$college_code}{'students'}}) {
if($student_num < 104000) { ## Delete the info of students before 2004.
delete $college_data_hr->{$college_code}{'students'}{$student_num};
}
}
}
当学院数量为70,000时,执行时间如下:
使用while循环的代码(间隔时间以秒为单位):
间隔时间:2.186621
间隔时间:2.058644
间隔时间:2.055645
间隔时间:2.101637
间隔时间:2.124632
使用foreach循环的代码(间隔时间以秒为单位):
间隔时间:1.341768
间隔时间:1.436751
间隔时间:1.346529
间隔时间:1.302775
间隔时间:1.356765
当学院数量为248,000时,执行时间如下:
(使用while循环的执行时间)
间隔时间:9.084427
间隔时间:8.438684
间隔时间:9.329338
间隔时间:9.169687
(使用foreach循环的执行时间)
间隔时间:5.502048
间隔时间:6.386692
间隔时间:5.596032
间隔时间:5.620144
while
/each
代码生成的临时值比foreach
代码多得多。我看不到$student_info_hr
在哪里被使用,但是while
/each
代码仍然会填充它。类似Devel::NYTProf
的工具可以帮助您逐行分解时间消耗情况。 - Joe Zdelete
对each
生成的迭代器会产生什么影响。在foreach
循环中,keys
会在前面运行一次以生成键列表。 - Joe Z