gpt4 book ai didi

string - Perl 中使用 "index()"与 RegEx 进行子字符串搜索的性能差异的原因是什么?

转载 作者:行者123 更新时间:2023-12-02 00:13:33 26 4
gpt4 key购买 nike

我假设以下方面可能存在效率差异:

if (index($string, "abc") < -1) {}

if ($string !~ /abc/) {}

有人可以根据两者在 Perl 中的实现方式(而不是纯粹的基准测试)来确认情况是这样吗?

我显然可以猜测两者是如何实现的(基于我如何用 C 编写两者),但理想情况下希望基于实际的 perl 源代码获得更明智的答案。

<小时/>

这是我自己的示例基准:

                          Rate regex.FIND_AT_END    index.FIND_AT_ENDregex.FIND_AT_END     639345/s                   --                 -88%index.FIND_AT_END    5291005/s                 728%                   --                          Rate regex.NOFIND         index.NOFINDregex.NOFIND          685260/s                   --                 -88%index.NOFIND         5515720/s                 705%                   --                          Rate regex.FIND_AT_START  index.FIND_AT_STARTregex.FIND_AT_START   672269/s                   --                 -90%index.FIND_AT_START  7032349/s                 946%                   --
##############################
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, {
"index.$type" => sub { my $idx = index($str, "abc"); },
"regex.$type" => sub { my $idx = ($str =~ $re); }
});
}

最佳答案

看一下 Perl_instr 函数:

 430 char *
431 Perl_instr(register const char *big, register const char *little)
432 {
433 register I32 first;
434
435 PERL_ARGS_ASSERT_INSTR;
436
437 if (!little)
438 return (char*)big;
439 first = *little++;
440 if (!first)
441 return (char*)big;
442 while (*big) {
443 register const char *s, *x;
444 if (*big++ != first)
445 continue;
446 for (x=big,s=little; *s; /**/ ) {
447 if (!*x)
448 return NULL;
449 if (*s != *x)
450 break;
451 else {
452 s++;
453 x++;
454 }
455 }
456 if (!*s)
457 return (char*)(big-1);
458 }
459 return NULL;
460 }

S_regmatch 进行比较。在我看来,与 index 相比,regmatch 存在一些开销;-)

关于string - Perl 中使用 "index()"与 RegEx 进行子字符串搜索的性能差异的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7620111/

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