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,
Dies ist immer noch ein bisschen langsam, aber nicht so viel wie der ursprüngliche Vergleich.
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.
Die folgenden zwei Zeilen machen nicht dasselbe!
%Vor%Das ist schon genug, um es zu einem unfairen Test zu machen.
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:
(erneut vor der Schleife ).
Also testen:
%Vor%und
%Vor%