Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Regex performance in mehreren Threads
Repac3r
myCSharp.de - Member



Dabei seit:
Beiträge: 57

Themenstarter:

Regex performance in mehreren Threads

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
weismat
myCSharp.de - Member



Dabei seit:
Beiträge: 872
Herkunft: Frankfurt am Main

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von weismat am .
private Nachricht | Beiträge des Benutzers
Repac3r
myCSharp.de - Member



Dabei seit:
Beiträge: 57

Themenstarter:

beantworten | zitieren | melden

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

Grüße

Moderationshinweis von MrSparkle (27.05.2015 - 18:16)

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

private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5.649
Herkunft: Leipzig

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers