javascript 正则表达式非捕获比完全没有括号快

javascript regex non-capture faster than no parenthesis at all

我正在玩 jsperf,看看 chrome 是否通过删除不必要的非捕获组来优化 javascript 正则表达式。然而,我对一个意想不到的结果感到困惑。

测试用例

const anotherUnneededNonCapture = /lab(?:o)rum/
const anotherNoNonCapture = /laborum/

anotherUnneededNonCapture.exec(loremString)
anotherNoNonCapture.exec(loremString)

(我正在测试 lorem ipsum 字符串,其中 "laborum" 是最后一个词)

预期

如果 chrome 通过删除不必要的非捕获组来优化 RE,我希望两个 "exec" 测试具有相同的性能。 如果引擎不应用此优化,我预计普通字符串会更快,因为它不会有不必要的组的开销。

实际结果

带有 "unneeded" 非捕获组的表达式总是比对应的表达式快 2 倍!

Link 到 jsperf

https://jsperf.com/simple-quantifier-optimization-2/1

我还在不同的 jsperf 测试中尝试了其他场景,结果都相似

有什么想法吗?非常感谢,干杯!

就 V8 而言,差异的原因与当正则表达式文字只是一个普通字符串时发生的 "optimization" 有关。在这些情况下,会进行简单的字符串搜索(例如隐式 loremString.indexOf('laborum')),而如果正则表达式字符串中有任何特殊的正则表达式字符,则会跳过此行为更改。

所以 /lab(?:o)rum/ 实际上是通过正则表达式引擎,而 /laborum/ 隐式地通过了类似 indexOf() 的搜索。

您可以在使用 --prof 从节点分析代码时看到这一点,然后使用 --prof-process 命令行选项。