Schnellere Ausführung von regexp als erwartet

8

Laut perlre sollte der folgende Code einige Sekunden zur Ausführung benötigen:

%Vor%

Die Dokumentation sagt:

  

Überlegen Sie, wie das obige Muster keine Übereinstimmung erkennt    ((()aaaaaaaaaaaaaaaaaa in einigen Sekunden, aber das jedes extra   Brief verdoppelt sich diesmal.

Wie gesehen, dauert es nur einen Bruchteil einer Sekunde auf meinem Laptop. Sogar läuft mit einer Million a ist in einer halben Sekunde abgeschlossen:

%Vor%

Was fehlt mir hier?

    
Håkon Hægland 20.08.2015, 07:41
quelle

2 Antworten

6

Einer der Tricks, um herauszufinden, was die Regex-Engine macht, ist:

%Vor%

ZB:

%Vor%

Dies wird dann drucken, was die Regex-Engine tatsächlich macht:

%Vor%

Wenn Sie Ihre Klammern wieder hinzufügen, erhalten Sie ein anderes Ergebnis - ich bekomme ungefähr 2000 Schritte, um die Regex zu verarbeiten. Dies wird mit jedem weiteren Buchstaben länger - etwa 300 Schritte.

Also würde ich ja sagen - ein katastrophales Backtracking findet statt, aber Sie werden vielleicht feststellen, dass Prozessoren (und Regex-Engine-Optimierungen) bedeuten, dass die Zeit wesentlich kürzer ist.

%Vor%

Läuft deutlich länger - aber zumindest ein Teil davon ist, weil das Drucken von Text auf dem Bildschirm vergleichsweise ziemlich "teuer" ist.

Mein Test schlägt vor (Anzahl von "a" s)

%Vor%

Es sieht sicherlich nach exponentiellem Verhalten aus - aber in beiden Fällen ist die Verarbeitungszeit immer noch ziemlich schnell, was ich auf schnellere CPUs (und vielleicht bessere Optimierung der Regex-Engine) zurückführen würde.

    
Sobrique 20.08.2015, 08:19
quelle
2
  

Überlegen Sie, wie das obige Muster in ((()aaaaaaaaaaaaaaaaaa in einigen Sekunden keine Übereinstimmung erkennt.

Dieser Satz stammt aus mindestens April 2001, als Perl 5.6.1 veröffentlicht wurde. Sie können die perlre man-Seite für diese Veröffentlichung unter search.cpan.org/~gsar sehen /perl-5.6.1/pod/perlre.pod .

Dies ist vielleicht eine Lektion, die Sie hier bei der Dokumentation von Software lernen können. Sei vorsichtig, was du schreibst, denn deine geschriebenen Worte bleiben trotz jahrelanger Verbesserungen und vieler Gabeln anderer unverändert.

    
David Hammen 20.08.2015 16:32
quelle

Tags und Links