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
命令行选项。
我正在玩 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
命令行选项。