我有一个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.9毫秒,而没有^
的模式只需要约0.1毫秒。我预测的缺陷在哪里?
AutoIt版本是3.3.14.2,我使用的是Intel Core 2 CPU。
答案 0 :(得分:3)
当模式以固定字符串开头时,在正则表达式引擎启动其正常行走之前,使用快速算法在主题字符串中查找此字符串的位置。这样只测试模式可能成功的位置。
在模式开头添加^
锚点会禁用此优化。 (模式不再以固定字符串开始。)
这就是为什么有时候更多手动模式可能会变慢的原因。