Freigeben über


Kompilierung und Wiederverwendung in regulären Ausdrücken

Sie können die Leistung von Anwendungen optimieren, die umfangreichen Gebrauch von regulären Ausdrücken machen, wenn Sie verstehen, wie die Engine für reguläre Ausdrücke kompiliert, und wie reguläre Ausdrücke zwischengespeichert werden. In diesem Artikel werden Kompilierung, Quellgenerierung und Zwischenspeicherung kompilierter regulärer Ausdrücke erläutert.

Interpretierte reguläre Ausdrücke

Standardmäßig kompiliert die Engine für reguläre Ausdrücke einen regulären Ausdruck in eine Sequenz interner Anweisungen (dies sind Codes auf höherer Ebene, die sich von Common Intermediate Language – CIL – unterscheiden). Wenn die Engine einen regulären Ausdruck ausführt, interpretiert sie die internen Codes.

Kompilierte reguläre Ausdrücke

Wenn ein Regex-Objekt mit der RegexOptions.Compiled-Option erstellt wird, wird der reguläre Ausdruck in expliziten CIL-Code und nicht in interne Anweisungen in regulären Ausdrücken auf höherer Ebene kompiliert. So kann der Just-in-Time-Compiler (JIT) von .NET den Ausdruck zur Leistungssteigerung in nativen Maschinencode konvertieren. Die Kosten für das Erstellen eines Regex-Objekts sind möglicherweise höher, aber die Kosten für die Durchführung eines Abgleichs sind wahrscheinlich deutlich geringer.

Quellengenerierte reguläre Ausdrücke

Die Quellgenerierung für reguläre Ausdrücke ist in .NET 7 und höheren Versionen verfügbar. Der Quellgenerator gibt als C#-Code eine benutzerdefinierte Regexabgeleitete Implementierung mit Logik aus, die dem entspricht, was RegexOptions.Compiled in der Zwischensprache ausgibt. Sie erhalten alle Durchsatzleistungsvorteile von RegexOptions.Compiled sowie die Startvorteile von Regex.CompileToAssembly, aber ohne die Komplexität von CompileToAssembly. Die ausgegebene Quelle ist Teil Ihres Projekts, was bedeutet, dass sie auch mühelos angezeigt und debuggt werden kann.

Verwenden Sie nach Möglichkeit die quellgenerierten regulären Ausdrücke, anstatt reguläre Ausdrücke mithilfe der RegexOptions.Compiled-Option zu kompilieren. Weitere Informationen zu quellengenerierten regulären Ausdrücken finden Sie unter Quellgeneratoren für reguläre .NET-Ausdrücke.

Der Cache für reguläre Ausdrücke

Zur Verbesserung der Leistung verwaltet die Engine für reguläre Ausdrücke einen anwendungsweiten Cache kompilierter regulärer Ausdrücke. Der Cache speichert Muster für reguläre Ausdrücke, die nur in statischen Methodenaufrufen verwendet werden. (An Instanzmethoden übergebene Muster für reguläre Ausdrücke werden nicht zwischengespeichert.) Zwischenspeichern vermeidet, dass Ausdrücke bei jeder Verwendung erneut analysiert und in Bytecode höherer Ebene kompiliert werden müssen.

Die maximale Anzahl der zwischengespeicherten regulären Ausdrücke wird durch den Wert der static (Shared in Visual Basic) Regex.CacheSize-Eigenschaft festgelegt. Standardmäßig speichert die Engine für reguläre Ausdrücke bis zu 15 kompilierte reguläre Ausdrücke zwischen. Wenn die Anzahl der kompilierten regulären Ausdrücke die Cachegröße überschreitet, wird der am längsten nicht verwendete reguläre Ausdruck verworfen und der neue reguläre Ausdruck zwischengespeichert.

Es gibt zwei Möglichkeiten, wie Ihre Anwendung reguläre Ausdrücke wiederverwenden kann:

  • Durch die Verwendung einer statischen Methode des Regex-Objekts zum Definieren des regulären Ausdrucks. Wenn Sie ein Muster für reguläre Ausdrücke verwenden, das bereits durch einen anderen statischen Methodenaufruf definiert wurde, ruft die Engine für reguläre Ausdrücke dieses aus dem Cache ab. Sofern nicht im Cache verfügbar, kompiliert die Engine den regulären Ausdruck und fügt ihn dem Cache hinzu.
  • Durch die Wiederverwendung eines vorhandenen Regex-Objekts, solange sein Muster des regulären Ausdrucks benötigt wird.

Aufgrund des Mehraufwands, der durch die Objektinstanziierung und Kompilierung von regulären Ausdrücken anfällt, stellt das Erstellen und schnelle Löschen zahlreicher Regex-Objekte einen kostspieligen Prozess dar. Sie können die Leistung von Anwendungen optimieren, die zahlreiche verschiedene reguläre Ausdrücke verwenden, indem Sie Aufrufe statischer Regex-Methoden verwenden und gegebenenfalls den Cache für reguläre Ausdrücke vergrößern.

Weitere Informationen