Проблема, которую вы поднимаете, не имеет ничего общего с циклами. И ваши A
и B
примеры одинаковы в этом отношении. Скорее проблема заключается в разнице между прямым встроенным кодированием и вызовом одного и того же кода через функцию.
Вызовы функций связаны с неизбежными накладными расходами. Я не могу говорить о том, стоит ли и почему эти издержки дороже в Perl по сравнению с другими языками, но я могу привести иллюстрацию лучшего способа измерения такого рода вещей:
use strict;
use warnings;
use Benchmark qw(cmpthese);
sub just_return { return }
sub get_string { my $s = sprintf "%s\n", 'abc' }
my %methods = (
direct => sub { my $s = sprintf "%s\n", 'abc' },
function => sub { my $s = get_string() },
just_return => sub { my $s = just_return() },
);
cmpthese(-2, \%methods);
Вот что я получаю на Perl v5.10.0 (многопоточность MSWin32-x86). Грубо говоря, простой вызов функции, которая ничего не делает, обходится так же дорого, как прямой запуск нашего sprintf
кода.
Rate function just_return direct
function 1062833/s -- -70% -71%
just_return 3566639/s 236% -- -2%
direct 3629492/s 241% 2% --
В общем, если вам нужно оптимизировать некоторый код Perl для скорости и вы пытаетесь выжать все до последней капли эффективности, прямое кодирование - это путь, но это часто идет с ценой меньшей ремонтопригодности и читаемость. Однако, прежде чем вы начнете заниматься такой микрооптимизацией, вы должны убедиться, что ваш базовый алгоритм является надежным и что вы твердо понимаете, где на самом деле находятся медленные части вашего кода. Легко тратить много сил на неправильную работу.