Не угадайте, когда вы сможете сделать бенчмарк:
use Benchmark 'cmpthese';
my $source = "\t\thello\n\t\t\tworld\n" x 100;
my $g_tab_width = 8;
my ($textU, $textN);
cmpthese(-3, {
ungreedy => sub {
$textU = $source;
$textU =~ s{(.*?)\t}{$1.(' ' x ($g_tab_width - length($1) % $g_tab_width))}ge;
},
negated => sub {
$textN = $source;
$textN =~ s{([^\n\t]*)\t}{$1.(' ' x ($g_tab_width - length($1) % $g_tab_width))}ge;
},
});
die "whoops" unless $textN eq $textU; # ensure they do the same thing
Я обнаружил, что не жадная версия (как она выглядит в источнике Markdown) примерно на 40% быстрее, чем предложенный вами класс отрицательных символов:
Rate negated ungreedy
negated 1204/s -- -30%
ungreedy 1718/s 43% --
Я думаю, что сопоставление .
более эффективно, чем класс отрицательных символов, что компенсирует дополнительный возврат.Для подтверждения этого потребуется больше тестов.