Швидкість проходу циклів у Perl’i
Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті.
Маю перебірний алґоритм з поважною кількістю прокручування циклів. Питання: чи однаковою є швидкодія проходу по списку від першого до останнього елемента і навпаки. Під C відповідь була би очевидною, тут же — залежить від внутрішностей перла, яких я не знаю.
Тест 1 (проходи від першого до останнього).
my $bb; my @aa = 1..10000; my $t0 = time;
for (my $i = 0; $i <= $#aa; ++$i) {
for (my $j = 0; $j <= $i; ++$j) { $bb = $aa[$j].$aa[$j]; }
}
print (time — $t0), «\n»;
Тест 2 (проходи ззаду наперед).
my $bb; my @aa = 1..10000; my $t0 = time;
for (my $i = $#aa; $i >= 0; $i—) {
for (my $j = $i; $j >= 0; $j—) { $bb = $aa[$j].$aa[$j]; }
}
print (time — $t0), «\n»;
Другий тест працює на 5% повільніше. Але в реальній задачі трішечки зручніше було би ходити, все ж, ззаду наперед. От і виходить шило на мило. Чи, може, є якісь мануали щодо швидкодії на перлі? якісь дослідження? Щоб не відкривати цю америку заново :-)
Я розумію, що такі речі правильніше робити на тому ж C і, зрештою, так собі й планую — відкатати алґоритм на перлі, а потім перенести його «обчислювальну» частину під C. Але поки ще настане те «потім»...
Варіянти з прямим перебором списку (for my $a (@aa)) я теж пробував, до слова — вони дають суттєво гірші результати.
4 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарів