Как улучшить производительность регулярных выражений Perl с помощью очень большого поиска и замены переменных? - PullRequest
0 голосов
/ 12 января 2012

В Perl поиск и замена большими переменными занимает много времени.

Например.

$original = 'aaaabc';
$replace = 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' x 1000
$original =~ s/b/$replace/;

Как только $replace станет достаточно большим, регулярное выражение может занять очень много времени Я предполагаю, что некоторый буфер нарушен и продолжает расширяться.

Есть ли предложения по улучшению производительности?

Ответы [ 3 ]

3 голосов
/ 12 января 2012

Насколько велика? Замена происходит в течение секунды в моем окне Windows, даже с длиной строки 30 000 000 30 000 000 000 000 000 000:

> perl -Mstrict -wE "my $start = time;my $str = 'aaaabc'; my $replace = 'b' x 30_000_000_000_000_000_000; $str =~ s/b/$replace/; printf qq<%d s\n>, time - $start;"
0 s
1 голос
/ 12 января 2012

Не уверен, почему вы видите снижение производительности.Я сделал строку для замены 50000+ символов, а затем запустил вашу программу, как написано.

$ time(perl large.pl )

real    0m0.010s
user    0m0.002s
sys     0m0.004s
$ 

Однако у меня есть предложение.Если ваша замещающая строка имеет конечную длину одного и того же символа, почему бы не найти определенный символ в исходной строке, разбить строку на этот символ, соединить детали в передней и задней части вашей замены и распечатать ее?

0 голосов
/ 12 января 2012
Benchmark gives 0 wallclock secs with your input 

#!/usr/bin/perl
use strict;
use warnings;
use Benchmark;

my $original = 'aaaabcd';
my $replace = 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' x 1000;
my $start_time = new Benchmark;
$original =~ s/b/$replace/;
my $end_time = new Benchmark;
my $diff = timediff($end_time,$start_time);
print "Regex took:",timestr($diff);

OUTPUT

Regex took 0 wallclock secs (0.00 usr + 0.00 sys = 0.00 CPU)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...