große Performance Probleme mit Regulären Ausdrücken!
-
Schönen guten Tag,
hab hier ein Problem mit Regulären Ausdrücken - ich verwende hierbei folgendes:
String ^msg_check = gcnew ... Regex^ rx_is_msg = gcnew Regex( "^[M][e][s][s][a][g][e]\\:\\s", static_cast<RegexOptions>(RegexOptions::Compiled | RegexOptions::IgnoreCase) ); MatchCollection ^matches = rx_is_msg->Matches( msg_check ); if( matches->Count > 0 ) { .... success }
Diese Abfrage soll ca. 50-60x pro Update ausgeführt und möglichst effizient abgearbeitet werden.
Die Regulären Ausdrücken, sind leider nicht wie in diesem Fall sehr einfach sondern durchaus komplex.
Meine Statistiken sagen mir, dass ich bei den Regulären Ausdrücken bereits über 0.6 sekunden brauche!!
Und eine einzelne Abfrage (wie oben) braucht 0.04, das durchaus sehr laange istKennt jemand von euch effizientere Möglichkeitne so etwas zu realisieren?
Mfg
JJ
-
Des Weiteren, der Quellcode ist an sich nicht interessant, die Frage ist, ob Reguläre Ausdrück grundlegen sehr langsam sind und mit meinen Zahlen in übereinklang zu bringen sind.
Oder womöglich anderes Probleme bereitet.
-
Hallo,
Reguläre Ausdrücke sind generell komplex in der abarbeitung. Ein eigenständiges Thema auch was "optimierung" angeht.
"^Message\:\\s
Versuche mal diesen Ausdruck und prüfe mal ob das eine Änderung bringt. Du lässt die Regex mit [M][e] ... jedesmal nach einzelnen Zeichen suchen wärend Du mit Message erlaubst nach den gesammten String zu suchen.Auch wenn es keine Hilfe ist, würde mich interessieren ob der Profiler nun weniger Zeitverbrauch meldet.
thx
-
Ok hab das ganze jetzt mal ausprobiert - habe eine Verbesserung auf 0.453950(von 0.2) sekunden erhalten, wobei das immernoch etwas zu langsam ist.
-
Wenn ich mich korrigieren darf: auf 0.4 (von 0.5)
-
Hm, wo genau geht die Zeit denn drauf ?
Wird das regexp Objekt auch 60 mal erzeugt ? Das geht leider aus dem Source nicht hervor.
Wenn das Objekt nur einmal erzeugt wird (regexp) und die Abfrage dann noch zu lange dauert, wirst Du wohl leider auf andere Methoden zurück greifen müssen um den String
"Message: "
zu finden. (Ich weiß aber nicht ob es sowas banales wie stricmp o.Ä. gibt).
-
Insgesamt konnte ich das gesamte System um ein paar hundert prozent verbessern. Problem bestand darin, dass der Reguläre Ausdruck jeweils beim Aufruf neu (mit gcnew) deklariert wurde.