为什么在向模式添加^时StringRegExp会变慢?

时间:2017-02-02 08:50:03

标签: regex performance autoit pcre

我有一个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。

1 个答案:

答案 0 :(得分:3)

当模式以固定字符串开头时,在正则表达式引擎启动其正常行走之前,使用快速算法在主题字符串中查找此字符串的位置。这样只测试模式可能成功的位置。

在模式开头添加^锚点会禁用此优化。 (模式不再以固定字符串开始。)

这就是为什么有时候更多手动模式可能会变慢的原因。