Laden...

Regex performance in mehreren Threads

Erstellt von Repac3r vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.154 Views
R
Repac3r Themenstarter:in
57 Beiträge seit 2014
vor 8 Jahren
Regex performance in mehreren Threads

Schönen Nachmittage euch,

zurzeit versuche ich herauszufinden, wie man Regex-Abfragen über mehrere Threads optimieren könnte. Alle Pattern werden dynamisch zur Laufzeit generiert. Dabei greifen mehrere Threads auf diese Regeln zu. Mir ist dabei aufgefallen, das die Performance in mehreren Threads sinkt.

Folgende Werte habe ich bei einer Analyse herausbekommen:


(Maximale Zeiten von ForEach/ParallelForeach 100000 Werten)

Regex in mehreren Threads:
Insanzieren eines Regex-Objekts: 125ms
Match einer Regel: 130ms
Kompletter Durchgang (Instanz + Match): 170ms
-----------------------------------------------------------------

Regex in einem Thread :
Insanzieren eines Regex-Objekts: 20ms
Match einer Regel: 26ms
Kompletter Durchgang (Instanz + Match): 26ms

Daraufhin habe ich mir mal die Regex-Klassen genauer angeschaut. Laut meiner Interpretation sperrt die Regex-Klasse andere Threads, sobald sie mit ihrer Cache interagiert.
Gibt es eine Möglichkeit, diesen Cache zu deaktivieren?

Gibt es eventuell andere Möglichkeiten, wie eine andere Regex-Engine?

Grüße

W
872 Beiträge seit 2005
vor 8 Jahren

Regex kannst Du entweder mittels statischen Methoden oder über eine Instanz von System.Text.RegularExpressions.Regex aufrufen.
Wenn Du Instanzen benutzt, dann sollte es kein Caching und damit auch mehr Performance bei mehren Threads geben. Die Instanzen sind immuteable und damit thread-safe.

R
Repac3r Themenstarter:in
57 Beiträge seit 2014
vor 8 Jahren

Das Problem ist ja, dass ich in meinem oben genannten Beispiel schon den Regex als Instanz benutze.

Grüße

Hinweis von MrSparkle vor 8 Jahren

Fullquote entfernt. Bitte beachte [Hinweis] Wie poste ich richtig?, Punkt 2.3

5.657 Beiträge seit 2006
vor 8 Jahren

Hi Repac3r,

dann darst du auf die Instanzen nicht aus unterschiedlichen Threads zugreifen. Jeder Thread benötigt seine eigene(n) RegEx-Instanz(en).

Christian

Weeks of programming can save you hours of planning

49.485 Beiträge seit 2005
vor 8 Jahren

Hallo Repac3r,

anscheinend gibt es zwei Stellen, an denen gelockt wird: beim Erstellen eines Regex-Objekts UND beim Durchführen eines Matches mit dem Objekt. Der erste Lock liegt daran, dass gleichzeitige Zugriffe auf den Cache verhindert werden müssen, der zweite Lock liegt daran, dass gemeinsame Zugriffe auf das interne RegexRunner-Objekt verhindert werden müssen. Das erste Problem sollte durch den Rat von weismat gelöst werden, das zweite durch den Rat von MrSparkle. Das nur als Hintergrundinfo.

Quelle: Multithreaded use of Regex

herbivore