Почему большой цикл в маленьком цикле быстрее, чем небольшой цикл внутри большого?

Это мой код 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 секунды

И математический код:

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}

Почему большой цикл снаружи занимает больше времени?

1 ответ

В выполнении внутреннего цикла (инициализация переменной, проверка чеков, если она должна закончиться) возникает определенное количество накладных расходов, а в первом случае вы теряете эти накладные расходы в 10 000 000 раз; во втором, вы делаете это только 10 раз.

EDIT: Пусть s время установки петли (например, инициализация переменной) и i время для итерации цикла (например, проверка конечного условия). Тогда:

Большая внутренняя петля

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 раза больше с большим внешним контуром, чем с большим внутренним контуром.

licensed under cc by-sa 3.0 with attribution.