Использование perl 'times' для получения значений времени процессора до и после следующих циклов показывает мне, что по какой-то причине предварительно скомпилированная версия регулярного выражения фактически на 33% медленнее, чем встроенное регулярное выражение. Я дважды сопоставил регулярные выражения, чтобы быть близким к коду примера и предотвратить любую загадочную оптимизацию perl во время циклов.
for (1..$num_runs) {
$test_string =~ $pcr;
$test_string =~ $pcr;
}
и
for(1..$num_runs) {
$test_string =~ m/\s*[\/\\]?\s*/;
$test_string =~ m/\s*[\/\\]?\s*/;
}
С $num_runs
= 10000000 и $pcr
и $test_string
:
my $pcr = qr/\s*[\/\\]?\s*/;
my $test_string = '<what>';
Время процессора после нахождения дельты и усреднения было:
------------------------------
Precompiled regex:
------------------------------
user : 0.0000040190
system : 0.0000000010
------------------------------
Inline regex:
------------------------------
user : 0.0000030580
system : 0.0000000000
Я не использовал Perl Benchmark.pm по личным причинам. Я видел, что это дает явно неправильные числа, и, хотя они были минимальными, сравнительный анализ не имеет смысла, если у вас есть числа, которым вы не можете доверять. Этим цифрам я могу доверять, хотя тесты, которые я тестировал, могут потребовать переоценки.