gpt4 book ai didi

regex - 为什么这两个RegEx基准测试有如此大的差异?

转载 作者:行者123 更新时间:2023-12-03 23:27:09 25 4
gpt4 key购买 nike

为什么这两个RegEx基准测试有如此大的差异?
他们使用相同的RegEx,一个就地,一个通过qr//存储

结果:

                          Rate rege1.FIND_AT_END    rege2.FIND_AT_ENDrege1.FIND_AT_END     661157/s                   --                 -85%rege2.FIND_AT_END    4384042/s                 563%                   --                          Rate rege1.NOFIND         rege2.NOFINDrege1.NOFIND          678702/s                   --                 -87%rege2.NOFIND         5117707/s                 654%                   --                          Rate rege1.FIND_AT_START  rege2.FIND_AT_STARTrege1.FIND_AT_START   657765/s                   --                 -85%rege2.FIND_AT_START  4268032/s                 549%                   --

# Benchmark
use Benchmark qw(:all);

my $count = 10000000;
my $re = qr/abc/o;
my %tests = (
"NOFIND " => "cvxcvidgds.sdfpkisd[s"
,"FIND_AT_END " => "cvxcvidgds.sdfpabcd[s"
,"FIND_AT_START " => "abccvidgds.sdfpkisd[s"
);

foreach my $type (keys %tests) {
my $str = $tests{$type};
cmpthese($count, {
"rege1.$type" => sub { my $idx = ($str =~ $re); },
"rege2.$type" => sub { my $idx = ($str =~ /abc/o); }
});
}

最佳答案

您正在处理本质上非常快的操作,因此您需要运行更多测试以缩小速度的范围。我还将基准模型从外部(允许执行cmpthese)切换为内部(for循环)速度放大。这样可以最大程度地减少子例程调用和cmpthese必须执行的工作的开销。最后,进行测试以查看差异是否随幅度变化很重要(在这种情况下不重要)。

use Benchmark 'cmpthese';

my $re = qr/abc/o;
my %tests = (
'fail ' => 'cvxcvidgds.sdfpkisd[s',
'end ' => 'cvxcvidgds.sdfpabcd[s',
'start' => 'abccvidgds.sdfpkisd[s',
);

for my $mag (map 10**$_, 1 .. 5) {
say "\n$mag:";
for my $type (keys %tests) {
my $str = $tests{$type};
cmpthese -1, {
'$re '.$type => sub {my $i; $i = ($str =~ $re ) for 0 .. $mag},
'/abc/o '.$type => sub {my $i; $i = ($str =~ /abc/o) for 0 .. $mag},
'/$re/ '.$type => sub {my $i; $i = ($str =~ /$re/ ) for 0 .. $mag},
'/$re/o '.$type => sub {my $i; $i = ($str =~ /$re/o) for 0 .. $mag},
}
}
}


10:
评价$ re失败/ $ re /失败/ $ re / o失败/ abc / o失败
$ re失败106390 / s--8%-72%-74%
/ $ re /失败115814 / s 9%--70%-71%
/ $ re / o失败384635 / s 262%232%--5%
/ abc / o失败403944 / s 280%249%5%-
费率$ re end / $ re / end / $ re / o end / abc / o end
$ re结束105527 / s--5%-71%-72%
/ $ re /结束110902 / s 5%--69%-71​​%
/ $ re / o结束362544 / s 244%227%--5%
/ abc / o结束382242 / s 262%245%5%-
费率$ re开始/ $ re /开始/ $ re / o开始/ abc / o开始
重新启动111002 / s--3%-72%-73%
/ $ re /开始114094 / s 3%--71%-73%
/ $ re / o开始390693 / s 252%242%--6%
/ abc / o开始417123 / s 276%266%7%-

100:
费率/ $ re /失败$ re失败/ $ re / o失败/ abc / o失败
/ $ re /失败12329 / s--4%-77%-79%
$ re失败12789 / s 4%--76%-78%
/ $ re / o失败53194 / s 331%316%--9%
/ abc / o失败58377 / s 373%356%10%-
费率$ re end / $ re / end / $ re / o end / abc / o end
$ re end 12440 / s--1%-75%-77%
/ $ re /结束12623 / s 1%--75%-77%
/ $ re / o结束50127 / s 303%297%--7%
/ abc / o结束53941 / s 334%327%8%-
费率$ re开始/ $ re /开始/ $ re / o开始/ abc / o开始
重新启动12810 / s--3%-76%-78%
/ $ re /开始13190 / s 3%--75%-77%
/ $ re / o开始52512 / s 310%298%--8%
/ abc / o开始57045 / s 345%332%9%-

1000:
评价$ re失败/ $ re /失败/ $ re / o失败/ abc / o失败
$ re失败1248 / s--8%-76%-80%
/ $ re /失败1354 / s 9%--74%-79%
/ $ re / o失败5284 / s 323%290%--16%
/ abc / o失败6311 / s 406%366%19%-
费率$ re end / $ re / end / $ re / o end / abc / o end
$ re end 1316 / s--1%-74%-77%
/ $ re /结束1330 / s 1%--74%-77%
/ $ re / o结束5119 / s 289%285%--11%
/ abc / o结束5757 / s 338%333%12%-
费率/ $ re /开始$ re开始/ $ re / o开始/ abc / o开始
/ $ re /开始1283 / s--1%-75%-81%
$ re开始1302 / s 1%--75%-80%
/ $ re / o开始5119 / s 299%293%--22%
/ abc / o开始6595 / s 414%406%29%-

10000:
费率/ $ re /失败$ re失败/ $ re / o失败/ abc / o失败
/ $ re /失败130 / s--6%-76%-80%
$ re失败139 / s 7%--74%-79%
/ $ re / o失败543 / s 317%291%--17%
/ abc / o失败651 / s 400%368%20%-
汇率/ $ re /结束$ re结束/ $ re / o结束/ abc / o结束
/ $ re /结束128 / s--3%-76%-79%
$ re end 132 / s 3%--76%-78%
/ $ re / o结束541 / s 322%311%--10%
/ abc / o结束598 / s 366%354%11%-
费率/ $ re /开始$ re开始/ $ re / o开始/ abc / o开始
/ $ re /开始132 / s--1%-77%-80%
$重新开始133 / s 1%--76%-79%
/ $ re / o开始566 / s 330%325%--13%
/ abc / o开始650 / s 394%388%15%-

100000:
费率/ $ re /失败$ re失败/ $ re / o失败/ abc / o失败
/ $ re /失败13.2 / s--8%-76%-78%
$ re失败14.2 / s 8%--74%-76%
/ $ re / o失败55.9 / s 325%292%--8%
/ abc / o失败60.5 / s 360%324%8%-
汇率/ $ re /结束$ re结束/ $ re / o结束/ abc / o结束
/ $ re /结束12.8 / s--3%-75%-79%
$ re结束13.2 / s 3%--75%-78%
/ $ re / o结束52.3 / s 308%297%--12%
/ abc / o结束59.7 / s 365%353%14%-
费率$ re开始/ $ re /开始/ $ re / o开始/ abc / o开始
$重新开始13.4 / s--2%-77%-78%
/ $ re /开始13.6 / s 2%--77%-78%
/ $ re / o开始58.2 / s 334%328%--6%
/ abc / o开始62.2 / s 364%357%7%-


您可以轻松地看到测试分为两类,即源中带有 /.../o的测试和没有源。由于这是语法上的差异,因此它为您提供线索,可能是编译器正在优化(或者允许运行时以某种方式进行缓存)的情况。 (一次完成后就删除变量检查,简化堆栈,不看源代码很难说)。

结果可能还取决于所使用的perl版本。以上测试在v5.10.1上运行

关于regex - 为什么这两个RegEx基准测试有如此大的差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7620747/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com