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

时间:2017-07-24 23:41:29

标签: javascript node.js regex google-chrome pcre

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

测试用例

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

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

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

期望

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

实际结果

表达式为"不需要"非捕获组总是比其对应组快2倍!

enter image description here

链接到jsperf

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

我也在不同的jsperf测试中尝试了其他场景,所有场景都有类似的结果

任何想法?非常感谢,干杯!

1 个答案:

答案 0 :(得分:2)

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

因此/lab(?:o)rum/实际上正在通过正则表达式引擎,而/laborum/隐含地经历indexOf() - 类似搜索。

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