規則運算式中的編譯和重複使用

只要了解規則運算式引擎如何編譯運算式,以及了解如何快取規則運算式,您就可以使大量使用規則運算式的應用程式達到最佳效能。 本主題討論編譯及快取。

編譯的規則運算式

根據預設,規則運算式引擎會將規則運算式編譯為內部指令的序列 (這些是不同於通用中間語言 (CIL) 的高階程式碼)。 當引擎執行規則運算式時,它將會解譯內部程式碼。

如果 Regex 物件是以 RegexOptions.Compiled 選項所建構,它會將規則運算式明確地編譯為 CIL 程式碼,而非高階規則運算式的內部指令。 這允許 .NET 的 Just-in-Time (JIT) 編譯器將運算式轉換為原生機器碼以達到較高效能。 建構 Regex 物件的成本可能較高,但執行相符項目的成本可能較小。

替代方法是使用先行編譯的規則運算式。 您可以使用 CompileToAssembly 方法,將您的所有運算式編譯為一個可重複使用的 DLL。 這樣可避免需要在執行階段進行編譯,同時仍能從已編譯之規則運算式的速度中獲益。

規則運算式快取

為了提升效能,規則運算式引擎會維護整個應用程式的已編譯規則運算式之快取。 這個快取會儲存只有在靜態方法呼叫中使用的規則運算式模式 (不會快取提供給執行個體方法的規則運算式模式)。這可避免在每次使用運算式時,必須將其重新剖析為高階位元組程式碼。

快取的規則運算式數目上限取決於 static (在 Visual Basic 中為 Shared) Regex.CacheSize 屬性值。 根據預設,規則運算式引擎最多可快取 15 個已編譯的規則運算式。 如果編譯的規則運算式數目超出快取大小,就會捨棄最近最少使用的規則運算式,並快取新的規則運算式。

您的應用程式可以透過下列其中一種方式以重新使用規則運算式:

  • 使用 Regex 物件的靜態方法來定義規則運算式。 如果您使用其他靜態方法呼叫中已定義的規則運算式模式,規則運算式引擎就會嘗試從快取中擷取這個規則運算式模式。 如果快取中沒有,則引擎會編譯規則運算式並新增至快取。

  • 在需要現有 Regex 物件的規則運算式模式時重複使用該物件。

由於物件具現化和規則運算式編譯會造成額外負荷,因此建立及快速終結多個 Regex 物件是個非常耗費資源的處理序。 對於使用大量不同規則運算式的應用程式,您可以使用靜態 Regex 方法的呼叫,或增加規則運算式快取的大小,以達到最佳效能。

另請參閱