2017-02-02 3 views
1

J'ai une fonction Measure qui exécute le modèle plusieurs fois pour obtenir le temps d'exécution moyen.Pourquoi StringRegExp est-il plus lent lorsque j'ajoute^au motif?

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. Mon premier modèle est (?m)^Connection:(.+), et le second est (?m)Connection:(.+). Comme vous pouvez le voir, la seule différence est l'ancre de début de ligne ^. Je pensais que le premier serait plus rapide car il échouerait plus vite. Cependant, mon résultat de test rapporte que le modèle avec ^ prend ~ 0.9ms alors que le modèle sans ^ ne prend que ~ 0.1ms. Où est la faille dans ma prédiction?

La version AutoIt est 3.3.14.2 et j'utilise le processeur Intel Core 2.

+2

Vous avez environ 300 majuscules 'C' dans votre contenu, mais plus de 1000 lignes, donc il y a plus d'endroits pour faire correspondre'^'que' C' –

Répondre

3

Lorsqu'un motif commence par une chaîne fixe, un algorithme rapide est utilisé pour trouver les positions de cette chaîne dans la chaîne de sujet avant que le moteur de regex commence sa marche normale. De cette façon, seules les positions où le modèle peut réussir sont testées. L'ajout de l'ancrage ^ au début de votre modèle désactive cette optimisation. (le modèle commence plus avec une chaîne fixe.)

Voilà pourquoi parfois un modèle plus conduit à la main peut être plus lent.