Sdílet prostřednictvím


Kompilace a opakované použití v regulárních výrazech

Výkon aplikací, které výrazně využívají regulární výrazy, můžete optimalizovat pochopením toho, jak modul regulárních výrazů kompiluje výrazy a jak se regulární výrazy ukládají do mezipaměti. Tento článek popisuje kompilaci, generování zdrojového kódu a ukládání kompilovaných regulárních výrazů do mezipaměti.

Interpretované regulární výrazy

Modul regulárních výrazů ve výchozím nastavení zkompiluje regulární výraz do posloupnosti interních instrukcí (jedná se o kódy vysoké úrovně, které se liší od společného zprostředkujícího jazyka nebo CIL). Když modul spustí regulární výraz, interpretuje interní kódy.

Kompilované regulární výrazy

Regex Pokud je objekt vytvořen s RegexOptions.Compiled možností, zkompiluje regulární výraz explicitní kód CIL místo interních instrukcí regulárního výrazu vysoké úrovně. To umožňuje . Kompilátor JIT (just-in-time) technologie NET pro převod výrazu na nativní strojový kód pro zajištění vyššího výkonu. Náklady na vytvoření objektu Regex mohou být vyšší, ale náklady na provádění shod s ním budou pravděpodobně mnohem menší.

Regulární výrazy generované zdrojem

Generování zdrojového kódu pro regulární výrazy je k dispozici v .NET 7 a novějších verzích. Zdrojový generátor generuje jako kód jazyka C# vlastní Regexodvozenou implementaci s logikou podobnou tomu, co RegexOptions.Compiled generuje v IL. Získáte všechny výhody RegexOptions.Compiled výkonu propustnosti a počáteční výhody Regex.CompileToAssembly, ale bez složitosti CompileToAssembly. Zdroj, který se vygeneruje, je součástí projektu, což znamená, že je také snadno zobrazitelný a laditelný.

Pokud je to možné, místo kompilování regulárních výrazů pomocí RegexOptions.Compiled možnosti používejte zdrojové generované regulární výrazy. Další informace o zdrojových generovaných regulárních výrazech najdete v tématu Generátory zdrojů regulárních výrazů .NET.

Mezipaměť regulárních výrazů

Aby se zlepšil výkon, modul regulárních výrazů udržuje mezipaměť kompilovaných regulárních výrazů v celé aplikaci. Mezipaměť ukládá vzory regulárních výrazů, které se používají pouze ve voláních statických metod. (Vzory regulárních výrazů zadané pro metody instancí nejsou uložené v mezipaměti.) Ukládání do mezipaměti zabraňuje nutnosti přepsat výraz do kódu vysoké úrovně při každém použití.

Maximální počet regulárních výrazů uložených v mezipaměti je určen hodnotou static vlastnosti (Sharedv jazyce Visual Basic). Regex.CacheSize Modul regulárních výrazů ve výchozím nastavení ukládá do mezipaměti až 15 zkompilovaných regulárních výrazů. Pokud počet zkompilovaných regulárních výrazů překročí velikost mezipaměti, zahodí se nejméně naposledy použitý regulární výraz a nový regulární výraz se ukládá do mezipaměti.

Vaše aplikace může opakovaně používat regulární výrazy jedním z následujících dvou způsobů:

  • Pomocí statické metody objektu Regex definovat regulární výraz. Pokud používáte vzor regulárního výrazu, který už byl definován jiným voláním statické metody, modul regulárních výrazů se ho pokusí načíst z mezipaměti. Pokud není v mezipaměti k dispozici, modul zkompiluje regulární výraz a přidá ho do mezipaměti.
  • Opětovným použitím existujícího Regex objektu, pokud je potřeba jeho vzor regulárního výrazu.

Kvůli režii vytváření instancí objektů a kompilace regulárních výrazů je vytváření a rychlé zničení mnoha Regex objektů nákladným procesem. U aplikací, které používají velký počet různých regulárních výrazů, můžete optimalizovat výkon pomocí volání statických Regex metod a případně zvýšením velikosti mezipaměti regulárních výrazů.

Viz také