Что представляет собой хороший тестовый пример, показывающий проблемы производительности регулярных выражений переменных pre / post / match в Perl? - PullRequest
2 голосов
/ 05 ноября 2010

В модуле English и некоторых других местах пользователям рекомендуется никогда не использовать переменные $& $` и $' или их English эквиваленты $MATCH $PREMATCH $POSTMATCH из-за того, что они будут медленнымиОткажитесь от использования регулярных выражений.

Что такое хороший тестовый пример (бенчмарк), показывающий проблемы с производительностью?

1 Ответ

5 голосов
/ 05 ноября 2010

Вот простая отправная точка, ища один символ в строках различной длины.Переменные соответствия делают копии исходной строки, поэтому я ожидал, что штраф будет пропорционален требуемому количеству копирования.Реальность кажется противоположной.(Вот почему мы тестируем, дети.) Стоимость сопоставления с более длинной строкой превышает затраты на создание копии.Оглядываясь назад, это имеет смысл, поскольку копия - это просто memcpy, в то время как механизм регулярных выражений должен сканировать посимвольно.

use 5.010;
use strict;
use warnings;
use Benchmark qw(cmpthese);

for my $n (map { 10 ** $_ } 0 .. 4) {
    my $string = 'a' x $n . 0 . 'a' x $n;

    print "N = $n:\n";
    cmpthese(1000000, {
        'w/ match vars'  => sub { $string =~ /\d/p },
        'w/o match vars' => sub { $string =~ /\d/  },
    });
    print "\n";
}

Результаты:

N = 1:
            (warning: too few iterations for a reliable count)
                    Rate  w/ match vars w/o match vars
w/ match vars  1184834/s             --           -54%
w/o match vars 2557545/s           116%             --

N = 10:
                    Rate  w/ match vars w/o match vars
w/ match vars  1164144/s             --           -49%
w/o match vars 2283105/s            96%             --

N = 100:
                    Rate  w/ match vars w/o match vars
w/ match vars   865052/s             --           -45%
w/o match vars 1560062/s            80%             --

N = 1000:
                   Rate  w/ match vars w/o match vars
w/ match vars  224568/s             --           -21%
w/o match vars 284333/s            27%             --

N = 10000:
                  Rate  w/ match vars w/o match vars
w/ match vars  26667/s             --           -15%
w/o match vars 31480/s            18%             --
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...