我正在使用jsperf来查看chrome是否通过删除不必要的非捕获组来优化javascript正则表达式。然而,我感到困惑的是一个意想不到的结果。
const anotherUnneededNonCapture = /lab(?:o)rum/
const anotherNoNonCapture = /laborum/
anotherUnneededNonCapture.exec(loremString)
anotherNoNonCapture.exec(loremString)
(我正在测试一个lorem ipsum字符串,其中" laborum"是最后一个字)
我希望有两个" exec"如果chrome通过删除不必要的非捕获组来优化RE,则测试具有相同的性能。 如果引擎不应用此优化,我希望正常的字符串更快,因为它不会有不必要的组的开销。
表达式为"不需要"非捕获组总是比其对应组快2倍!
https://jsperf.com/simple-quantifier-optimization-2/1
我也在不同的jsperf测试中尝试了其他场景,所有场景都有类似的结果
任何想法?非常感谢,干杯!
答案 0 :(得分:2)
就V8而言,差异的原因与regexp文字只是普通字符串时出现的“优化”有关。在这些情况下,进行简单的字符串搜索(例如隐式loremString.indexOf('laborum')
),如果正则表达式字符串中有任何特殊的正则表达式字符,则会跳过此行为更改。
因此/lab(?:o)rum/
实际上正在通过正则表达式引擎,而/laborum/
隐含地经历indexOf()
- 类似搜索。
使用--prof
从节点分析代码,然后使用--prof-process
命令行选项分析代码时,可以看到这一点。