什么是一个很好的测试用例,显示了Perl中pre/post/match vars的正则表达式性能问题?

Eri*_*rom 2 regex perl performance

English模块和其他一些地方,建议用户永远不要使用$& $`$'变量或它们的English等价物,$MATCH $PREMATCH $POSTMATCH因为它们会减慢所有正则表达式的使用.

什么是显示性能问题的良好测试用例(基准测试)?

Mic*_*man 5

这是一个简单的起点,在不同长度的字符串中查找单个字符.匹配变量生成源字符串的副本,因此我希望惩罚与所需的复制量成比例.现实似乎正好相反.(这就是我们基准测试的原因,儿童.)与较长字符串匹配的成本超过了制作副本的开销.回想起来,这是有道理的,因为副本只是一段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";
}
Run Code Online (Sandbox Code Playgroud)

结果:

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%             --
Run Code Online (Sandbox Code Playgroud)