規則運算式中的編譯和重複使用
只要了解規則運算式引擎如何編譯運算式,以及了解如何快取規則運算式,您即可讓大量使用規則運算式的應用程式達到最佳效能。 本文會討論編譯的規則運算式的編譯、來源產生和快取。
解譯的規則運算式
根據預設,規則運算式引擎會將規則運算式編譯為內部指令的序列 (這些是不同於通用中間語言 (CIL) 的高階程式碼)。 當引擎執行規則運算式時,它將會解譯內部程式碼。
編譯的規則運算式
如果 Regex 物件是以 RegexOptions.Compiled 選項所建構,它會將規則運算式明確地編譯為 CIL 程式碼,而非高階規則運算式的內部指令。 這允許 .NET 的 Just-in-Time (JIT) 編譯器將運算式轉換為原生機器碼以達到較高效能。 建構 Regex 物件的成本可能較高,但執行相符項目的成本可能較小。
來源產生的規則運算式
規則運算式的來源產生功能可在 .NET 7 和更新版本中使用。 來源產生器會以 C# 程式碼的形式發出自訂 Regex
衍生實作,其邏輯類似於 RegexOptions.Compiled
在 IL 中發出的邏輯。 您可取得 RegexOptions.Compiled
在輸送量效能上的所有優勢以及 Regex.CompileToAssembly
在啟動時的優勢,但不會有 CompileToAssembly
的複雜度。 發出的來源是專案的一部分,這表示也可以輕易地檢視來源和偵錯。
可能的話,請使用來源產生的規則運算式,而不是使用 RegexOptions.Compiled 選項編譯規則運算式。 如需來源產生的規則運算式的詳細資訊,請參閱 .NET 規則運算式來源產生器 (部分機器翻譯)。
規則運算式快取
為了提升效能,規則運算式引擎會維護整個應用程式的已編譯規則運算式之快取。 這個快取會儲存只有在靜態方法呼叫中使用的規則運算式模式 (不會快取提供給執行個體方法的規則運算式模式。)快取可避免在每次使用運算式時,必須將其重新剖析為高階位元組程式碼。
快取的規則運算式數目上限取決於 static
(在 Visual Basic 中為 Shared
) Regex.CacheSize 屬性值。 根據預設,規則運算式引擎最多可快取 15 個已編譯的規則運算式。 如果編譯的規則運算式數目超出快取大小,就會捨棄最近最少使用的規則運算式,並快取新的規則運算式。
您的應用程式可以透過下列其中一種方式以重新使用規則運算式:
- 使用 Regex 物件的靜態方法來定義規則運算式。 如果您使用其他靜態方法呼叫中已定義的規則運算式模式,規則運算式引擎就會嘗試從快取中擷取這個規則運算式模式。 如果快取中沒有,則引擎會編譯規則運算式並新增至快取。
- 在需要現有 Regex 物件的規則運算式模式時重複使用該物件。
由於物件具現化和規則運算式編譯會造成額外負荷,因此建立及快速終結多個 Regex 物件會是昂貴的流程。 對於使用大量不同規則運算式的應用程式,您可以使用靜態 Regex
方法的呼叫,或增加規則運算式快取的大小,以達到最佳效能。