warum C ++ 11 Regex (libc ++ - Implementierung) ist so langsam?

8

Ich habe mit Linux C Regex-Bibliothek verglichen,

%Vor%

Das Ergebnis ist ungefähr 60-70 Millisekunden auf meiner Testmaschine.

Dann habe ich die Bibliothek von libc ++ benutzt,

%Vor%

Das Ergebnis ist ungefähr 2 Sekunden für regex_search & amp; regex_match. Dies ist ungefähr 30 Mal langsamer als Cs regex.h-Bibliothek.

Ist etwas falsch mit meinem Vergleich? Ist die Regex-Bibliothek von C ++ nicht für Hochleistungsklassen geeignet?

Ich kann verstehen, dass es langsam ist, weil es in c ++ 's Regex-Bibliothek noch keine Optimierung gibt, aber 30 mal langsamer ist einfach zu viel.

Danke.

Hallo alle,

Danke für die Antwort.

Entschuldigung für meinen Fehler Ich habe [] auch für C benutzt, aber später habe ich mich geändert und vergessen, den C ++ - Code zu ändern.

Ich habe zwei Änderungen vorgenommen,

  1. Ich habe const char sz [] aus der Schleife für C & amp; C ++.
  2. Ich habe es mit -O2 kompiliert (ich habe noch keine Optimierung verwendet), die Implementierung der C-Bibliothek dauert immer noch 60 Millisekunden, aber die Regex von libc ++ gibt nun eine Zahl von 1 Sekunde für regex_search und 150 Millisekunden für regex_match / li>

Dies ist immer noch ein bisschen langsam, aber nicht so viel wie der ursprüngliche Vergleich.

    
user534498 06.01.2014, 03:21
quelle

3 Antworten

8

Wenn Sie sich Ссылка ansehen, sehen Sie diese Implementierung von regex_match ist überlagert auf regex_search , und alle Überladungen extrahieren Unterausdruck-Match-Positionen, auch wenn sie nur in lokale Provisorien fallen, die weggeworfen werden. regex_search verwendet vector von __state Objekte, die .resize() aufgerufen haben, also sind vermutlich auch Vektoren - alle Heap-Zuordnungen und unnötig, wenn die Teilausdruck-Übereinstimmungen nicht erwünscht sind, aber verfolgt werden müssen, um% zu unterstützen co_de% etc in perl-artigen Erweiterungen für reguläre Ausdrücke: Die alten / regcomp C-Funktionen haben diese erweiterten Funktionen nicht zur Verfügung gestellt. Natürlich wäre es schön, wenn die Clam-Implementierung den regulären Ausdruck nach Übereinstimmungen während des Kompilierens sucht und schlankere, schnellere Funktionen nennt, die möglichst übereinstimmen, aber ich schätze, sie beginnen gerade mit der Unterstützung für den allgemeinen Fall.

    
Tony Delroy 06.01.2014, 04:38
quelle
10

Die folgenden zwei Zeilen machen nicht dasselbe!

%Vor%

Das ist schon genug, um es zu einem unfairen Test zu machen.

    
quelle
1

sz und match sind Schleifeninvariant, Sie sollten sie vorher verschieben (in beiden Fällen für sz ).

Im zweiten Fall ist sz ein initialisiertes Array anstelle eines Zeigers auf ein konstantes Literal - das ist ein unfairer und unnötiger Unterschied. Das heißt, wenn Sie die Deklaration wie vorgeschlagen vor die Schleife verschieben, sollte das wenig oder keinen Unterschied machen.

Obwohl regex_search() für const const char* überladen ist, was intern die Konstruktion einer std::string verursachen kann, sollten Sie diese Möglichkeit mit:

testen %Vor%

(erneut vor der Schleife ).

Also testen:

%Vor%

und

%Vor%     
Clifford 06.01.2014 03:52
quelle

Tags und Links