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. Dieses Thema behandelt das Kompilieren und das Zwischenspeichern.

Kompilierte reguläre Ausdrücke

Standardmäßig kompiliert die Engine für reguläre Ausdrücke einen regulären Ausdruck in eine Sequenz von internen Anweisungen (hierbei handelt es sich um Codes auf höherer Ebene, die sich von Microsoft Intermediate Language – MSIL – unterscheiden). Wenn die Engine einen regulären Ausdruck ausführt, interpretiert sie die internen Codes.

Wenn ein Regex-Objekt mit der RegexOptions.Compiled-Option erstellt wird, kompiliert es den regulären Ausdruck in expliziten MSIL-Code und nicht in interne Anweisungen in regulären Ausdrücken auf hoher Ebene. 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.

Eine Alternative ist die Verwendung von vorkompilierten regulären Ausdrücken. Mit der CompileToAssembly-Methode können Sie all Ihre Ausdrücke in eine wiederverwendbare DLL kompilieren. Hierdurch entfällt die Notwendigkeit für eine Kompilierung zur Laufzeit, und Sie profitieren gleichzeitig von der Schnelligkeit kompilierter regulärer 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.) Dadurch wird vermieden, 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 sehr 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.

Siehe auch