Сначала я проверил, если все процедуры дают мне правильный результат. Процедура MBO не прошла первый тест (он возвращает ссылку на массив); чтобы дать ему второе изменение, я изменил процедуру, чтобы получить правильный результат.
Я запускаю бенчмарк несколько раз, и я не всегда получал тот же порядок. Итак, я бы сказал (как уже здесь здесь) ysth's и fasest_Eric_Strom являются самыми быстрыми, но list_utils уменьшается почти так же быстро, как и они; Что легко прочитать из результатов, так это то, что версия David Precious-sort является самой медленной, а модифицированная сокращенная версия MBO занимает второе место.
Мой вывод: list_utils reduce является победителем лучшего соотношения цены и качества.
редактировать: я был слишком быстр с церемонии награждения: List::Util - reduce - length - encoding - question
David_Precious 64147/s -- -36% -73% -79% -80% -81% -85% -86% -87%
MBO 100195/s 56% -- -58% -67% -69% -70% -77% -79% -80%
OMG_peanuts 237772/s 271% 137% -- -21% -27% -30% -45% -50% -52%
longest_Eric_Strom 300466/s 368% 200% 26% -- -8% -11% -31% -36% -40%
drewk 325883/s 408% 225% 37% 8% -- -4% -25% -31% -34%
bvr 338156/s 427% 237% 42% 13% 4% -- -22% -28% -32%
list_util_xs 434114/s 577% 333% 83% 44% 33% 28% -- -8% -13%
fastest_Eric_Strom 471812/s 636% 371% 98% 57% 45% 40% 9% -- -5%
ysth 497198/s 675% 396% 109% 65% 53% 47% 15% 5% --
.
#!/usr/bin/env perl
use warnings;
use 5.012;
use Benchmark qw(:all) ;
use List::Util qw(reduce);
my @array = qw(one two three four five six seven eight nine very_long_long ten eleven);
sub list_util_xs {
my $l = reduce{ length($a) > length($b) ? $a : $b } @array;
return $l;
}
sub longest_Eric_Strom {
my $max = -1; my $max_i = 0;
for (0 .. $#array) {
my $len = length $array[$_];
if ($len > $max) {
$max = $len;
$max_i = $_;
}
}
return $array[$max_i];
}
sub fastest_Eric_Strom {
my $max = -1; my $max_ref;
for (@array) {
if (length > $max) {
$max = length;
$max_ref = \$_;
}
}
return $$max_ref;
}
sub David_Precious {
my $longest = (map { $_->[0] } sort { $b->[1] <=> $a->[1] } map { [ $_, length $_ ] } @array)[0];
return $longest;
}
sub MBO {
my $longest = (reduce { $a->[1] > $b->[1] ? $a : $b } map { [ $_, length $_ ] } @array)[0];
return $longest->[0];
}
sub drewk {
my $len = -1; my $longest;
for (@array) {
my $tmp=length($_);
if ($tmp > $len) {
$longest = $_;
$len = $tmp;
}
}
return $longest;
}
sub ysth {
my $longest = $array[0];
my $len = length $longest;
for my $str (@array) {
if (length($str) > $len) {
$longest = $str;
$len = length($str);
}
}
return $longest;
}
sub bvr {
my $len = length $array[0];
my $longest = 0;
for my $i (1 .. $#array) {
my $i_len = length $array[$i];
if($i_len > $len) {
$longest = $i;
$len = $i_len;
}
}
return $array[$longest];
}
sub OMG_peanuts {
my $idx = 1;
my $lastLength = length $array[0];
my $lastElt = $array[0];
my $listLength = scalar @array;
while ($idx < $listLength) {
my $tmpLength = length $array[$idx];
if ($tmpLength > $lastLength) {
$lastElt = $array[$idx];
$lastLength = $tmpLength
}
$idx++
}
return $lastElt;
}
cmpthese(-10, {
'list_util_xs' => sub{ list_util_xs() },
'longest_Eric_Storm' => sub{ longest_Eric_Strom() },
'fastest_Eric_Storm' => sub{ fastest_Eric_Strom() },
'David_Precious' => sub{ David_Precious() },
'MBO' => sub{ MBO() },
'drewk' => sub{ drewk() },
'ysth' => sub{ ysth() },
'OMG_peanuts' => sub{ OMG_peanuts() },
'bvr' => sub{ bvr() },
});
Это ненужно 'Использовать список :: Util :: XS 'если ваша программа не должна умереть, если не установлена версия XS. 'use List :: Util' автоматически загружает версию XS, если она доступна. – cjm
«Быстрее», вы имеете в виду время выполнения или время кодирования? – outis
Вы пытаетесь оптимизировать свое приложение?Профилировщик действительно сказал вам, что эта одна строка в вашей заявке занимает значительную часть времени обработки? – rafl