为什么将 ^ 添加到模式时 StringRegExp 变慢?
Why does StringRegExp slower when I add ^ to the pattern?
我有一个 Measure
函数,它多次执行模式以获得平均执行时间。
Func Measure($text, $pattern, $repetitionCount)
Local $timer, $elapsed = 0
For $i = 1 To $repetitionCount
$timer = TimerInit()
StringRegExp($text, $pattern, 3)
$elapsed += TimerDiff($timer)
Next
Return $elapsed
EndFunc
This is the subject string。我的第一个模式是(?m)^Connection:(.+)
,第二个是(?m)Connection:(.+)
。如您所见,唯一的区别是行首锚点 ^
。我认为前者会更快,因为它会更快地失败。但是,我的测试结果报告带有 ^
的模式需要 ~0.9ms,而没有 ^
的模式只需要 ~0.1ms。我预测的漏洞在哪里?
AutoIt 版本是 3.3.14.2,我使用的是 Intel Core 2 CPU。
当模式以固定字符串开头时,会使用快速算法在正则表达式引擎开始正常遍历之前查找该字符串在主题字符串中的位置。这样只会测试模式可能成功的位置。
在模式开头添加 ^
锚点会禁用此优化。 (模式不再以固定字符串开头。)
这就是为什么有时 more hand-driven 模式可能会更慢的原因。
我有一个 Measure
函数,它多次执行模式以获得平均执行时间。
Func Measure($text, $pattern, $repetitionCount)
Local $timer, $elapsed = 0
For $i = 1 To $repetitionCount
$timer = TimerInit()
StringRegExp($text, $pattern, 3)
$elapsed += TimerDiff($timer)
Next
Return $elapsed
EndFunc
This is the subject string。我的第一个模式是(?m)^Connection:(.+)
,第二个是(?m)Connection:(.+)
。如您所见,唯一的区别是行首锚点 ^
。我认为前者会更快,因为它会更快地失败。但是,我的测试结果报告带有 ^
的模式需要 ~0.9ms,而没有 ^
的模式只需要 ~0.1ms。我预测的漏洞在哪里?
AutoIt 版本是 3.3.14.2,我使用的是 Intel Core 2 CPU。
当模式以固定字符串开头时,会使用快速算法在正则表达式引擎开始正常遍历之前查找该字符串在主题字符串中的位置。这样只会测试模式可能成功的位置。
在模式开头添加 ^
锚点会禁用此优化。 (模式不再以固定字符串开头。)
这就是为什么有时 more hand-driven 模式可能会更慢的原因。