gpt4 book ai didi

regex - 为什么这个正则表达式调用 substcont 的次数过多?

转载 作者:行者123 更新时间:2023-12-03 15:48:44 28 4
gpt4 key购买 nike

这比其他任何事情都更出于好奇,因为我无法在 Google 上找到有关此功能的任何有用信息(CORE::substcont)

在分析和优化一些旧的、缓慢的 XML 解析代码时,我发现以下正则表达式在每次执行该行时调用 substcont 31 次,并花费大量时间:

Calls: 10000 Time: 2.65s Sub calls: 320000 Time in subs: 1.15s`


  $handle =~s/(>)\s*(<)/$1\n$2/g;
# spent 1.09s making 310000 calls to main::CORE:substcont, avg 4µs/call
# spent 58.8ms making 10000 calls to main::CORE:subst, avg 6µs/call

与前一行相比:

Calls: 10000 Time: 371ms Sub calls: 30000 Time in subs: 221ms


  $handle =~s/(.*)\s*(<\?)/$1\n$2/g;
# spent 136ms making 10000 calls to main::CORE:subst, avg 14µs/call
# spent 84.6ms making 20000 calls to main::CORE:substcont, avg 4µs/call

substcont 调用的数量非常令人惊讶,尤其是看到我认为第二个正则表达式会更贵。显然,这就是为什么分析是一件好事;-)

我随后更改了这两行以删除不必要的反向引用,对行为不良的行产生了戏剧性的结果:

Calls:10000 Time: 393ms Sub calls: 10000 Time in subs: 341ms


$handle =~s/>\s*</>\n</g;
# spent 341ms making 10000 calls to main::CORE:subst, avg 34µs/call
  • 所以,我的问题是 - 为什么原始版本应该对 substcont 进行如此多的调用,而 substcont 甚至在需要这么长时间的正则表达式引擎中做了什么?
  • 最佳答案

    substcont是 Perl 的“替换迭代器”的内部名称。与s///有关.根据我掌握的少量信息,似乎substcont在执行 backref 时触发。也就是说,当 $1存在。你可以使用 B::Concise 来玩玩它。

    这是一个没有 backref 的简单正则表达式的操作码。

    $ perl -MO=Concise,-exec -we'$foo = "foo";  $foo =~ s/(foo)/bar/ig'
    1 <0> enter
    2 <;> nextstate(main 1 -e:1) v:{
    3 <$> const[PV "foo"] s
    4 <#> gvsv[*foo] s
    5 <2> sassign vKS/2
    6 <;> nextstate(main 1 -e:1) v:{
    7 <#> gvsv[*foo] s
    8 <$> const[PV "bar"] s
    9 </> subst(/"(foo)"/) vKS
    a <@> leave[1 ref] vKP/REFC
    -e syntax OK

    和一个。
    $ perl -MO=Concise,-exec -we'$foo = "foo";  $foo =~ s/(foo)/$1/ig'
    1 <0> enter
    2 <;> nextstate(main 1 -e:1) v:{
    3 <$> const[PV "foo"] s
    4 <#> gvsv[*foo] s
    5 <2> sassign vKS/2
    6 <;> nextstate(main 1 -e:1) v:{
    7 <#> gvsv[*foo] s
    8 </> subst(/"(foo)"/ replstart->9) vKS
    9 <#> gvsv[*1] s
    a <|> substcont(other->8) sK/1
    b <@> leave[1 ref] vKP/REFC
    -e syntax OK

    这就是我所能提供的。您可能想尝试 Rx , mjd 的旧正则表达式调试器。

    关于regex - 为什么这个正则表达式调用 substcont 的次数过多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2898637/

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