2017-02-02 2 views
1

Ich habe eine Measure Funktion, die das Muster mehrmals ausführt, um die durchschnittliche Ausführungszeit zu erhalten.Warum wird StringRegExp langsamer, wenn ich dem Muster^hinzufüge?

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. Mein erstes Muster ist (?m)^Connection:(.+), und das zweite ist (?m)Connection:(.+). Wie Sie sehen können, ist der einzige Unterschied der Start-of-Line-Anker ^. Ich dachte, Ersteres wäre schneller, weil es schneller scheitern würde. Mein Testergebnis meldet jedoch, dass das Muster mit ^ ~ 0,9 ms dauert, während das Muster ohne ^ nur ~ 0,1 ms dauert. Wo ist der Fehler in meiner Vorhersage?

Die AutoIt-Version ist 3.3.14.2 und ich verwende Intel Core 2 CPU.

+2

Sie haben ungefähr 300 Großbuchstaben 'C' in Ihrem Inhalt, aber über 1000 Zeilen, so dass es mehr Orte gibt, die mit'^'übereinstimmen als mit' C' –

Antwort

3

Wenn ein Muster mit einer festen Zeichenfolge beginnt, wird ein schneller Algorithmus verwendet, um Positionen dieser Zeichenfolge in der Betreffzeichenfolge zu finden, bevor die Regex-Engine ihren normalen Ablauf beginnt. Auf diese Weise werden nur Positionen getestet, an denen das Muster erfolgreich sein kann.

Durch Hinzufügen des ^ Ankers am Anfang Ihres Musters wird diese Optimierung deaktiviert. (das Muster beginnt nicht mehr mit einem festen String.)

Deshalb manchmal ein handbetriebene Muster langsamer sein können.

Verwandte Themen