2014-04-16 167 views
4

这是我的Perl代码为什么一个小循环中的大循环比大循环中的小循环更快?

$big=10_000_000; 
#A:big loop outside 
my $begin_time = time; 
foreach my $i (1..$big) { 
     foreach my $p (1..10){ 
     } 
} 
my $end_time = time; 
my $t1=$end_time-$begin_time; 

#B:small loop outside 
my $begin_time = time; 
foreach my $i (1..10){ 
    foreach my $p (1..$big){ 
    } 
} 
my $end_time = time; 
my $t2=$end_time-$begin_time; 

#output 
print $t1; 
print "\n"; 
print $t2; 

T1 =8秒
T2 =3秒

利用Mathematica代码:

Timing[Do[2, {i, 1, 10}, {j, 2*1, 10^7}]] 
output:{14.328, Null} 
Timing[Do[2, {j, 1, 2*10^7}, {i, 1, 10}]] 
output:{30.937, Null} 

为什么大环外需要更多时间?

+0

'perl -MO =简明script.pl'在第一种情况下给出了更多的操作码。 –

+0

我的母语不是英语,但你理解我的意思非常好!感谢您的编辑 – cn8341

+1

应该指出,如果你在循环中做了一些真正的计算,性能可能会非常好地反转 - 不要得出一个清晰的结论由此。 – agentp

回答

9

在执行内部循环时有一定的开销(初始化变量;使检查看它是否应该结束),在第一种情况下,您将损失10,000,000次开销;在第二,你只做了10次。

编辑: 让s是设置循环(例如,初始化变量)和迭代循环的时间(例如,测试结束条件)的时间。然后:

大内环

T = s1 + 10 * (i1 + s2 + 10,000,000*i2) 
    = s1 + 10*i1 + 10*s2 + 100,000,000*i2 

大外环

T = s1 + 10,000,000 * (i1 + s2 + 10*i2) 
    = s1 + 10,000,000*i1 + 10,000,000*s2 + 100,000,000*i2 

差异

diff = 9,999,990*i1 + 9,999,990*s2 

所以外循环(i1)的迭代时间和内循环(s2)的建立时间都是大外循环比内循环大9,999,990倍。

+0

它是10,000,000次,而不是10,000。在两种情况下,检查循环是否应该结束的时间是相同的:这只是初始循环设置和后来拆除不同, – Borodin

+0

@Borodin - 抱歉,误读了数字。增加了关于设置和迭代循环的更多细节。 – TripeHound

+1

@Borodin:在两种情况下,内循环的确被检查了相同的次数。外环在一种情况下检查10次,在另一种情况下检查10E6次。 – Arkadiy