Как я уже сказал в комментарии, используйте Benchmark для проведения подобных сравнений. Бенчмарк обрабатывает все подробности о времени проведения тестов и печати отчета.
Еще одна вещь, о которой стоит упомянуть, это то, что ваш тест не проверяет то, что вы думаете. Ваши тесты выдвигают значения на @preciousvalues1
и @preciousvalues2
. Каждая итерация теста добавляет примерно 500 результатов к одному из массивов. Поскольку вы не очищаете массивы между итерациями, вы получаете два массива, каждый из которых содержит около 12,5 миллионов записей. Я предполагаю, что это приводит вас к обмену и ведет к медленному, полуслучайному времени выполнения. Это также является причиной задержки при выходе из вашей программы. Вы выделили огромное количество оперативной памяти для этих структур. Perl хочет правильно их разорвать и убедиться, что все деструкторы или блоки END сработали.
Вот очищенная версия вашего теста, которая фокусируется на хэш-доступе. Я добавил решение Mobrule для сравнения.
use strict;
use warnings;
use Benchmark qw(cmpthese);
my $hashref = { };
for (0..249) {
my $lIdx = $_ * 2;
$hashref->{"MYKEY$lIdx"} = "MYVAL$lIdx";
}
sub WithVariable{
my $result = $hashref->{"MYKEY$_[0]"};
return defined $result ? $result : "NONE";
}
sub WithoutVariable{
return defined $hashref->{"MYKEY$_[0]"} ? $hashref->{"MYKEY$_[0]"} : "NONE";
}
cmpthese( 25000, {
"With Var" => sub {
my @vals;
push @vals, WithVariable($_) for 0..498;
},
"Without Var" => sub {
my @vals;
push @vals, WithoutVariable($_) for 0..498;
},
"Mobrule" => sub {
my @vals;
push @vals, $hashref->{"MYKEY$_"} // 'NONE' for 0..498;
}
} );
Со следующими результатами в моей системе:
Rate With Var Without Var Mobrule
With Var 1382/s -- -0% -49%
Without Var 1389/s 1% -- -49%
Mobrule 2700/s 95% 94% --
Совершенно очевидно, что решение mobrule быстрее и что между двумя другими реализациями есть только крошечная разница. Большая разница в том, что решение mobrule не выполняет вызов функции, который используют две другие реализации.