Kompilacja i ponowne użycie w wyrażeniach regularnych
Możesz zoptymalizować wydajność aplikacji, które intensywnie korzystają z wyrażeń regularnych, rozumiejąc, jak aparat wyrażeń regularnych kompiluje wyrażenia i jak są buforowane wyrażenia regularne. W tym artykule omówiono kompilację, generowanie źródła i buforowanie skompilowanych wyrażeń regularnych.
Interpretowane wyrażenia regularne
Domyślnie aparat wyrażeń regularnych kompiluje wyrażenie regularne do sekwencji instrukcji wewnętrznych (są to kody wysokiego poziomu, które różnią się od wspólnego języka pośredniego lub CIL). Gdy aparat wykonuje wyrażenie regularne, interpretuje kody wewnętrzne.
Skompilowane wyrażenia regularne
Regex Jeśli obiekt jest skonstruowany z opcjąRegexOptions.Compiled, kompiluje wyrażenie regularne do jawnego kodu CIL zamiast instrukcji wewnętrznych wyrażeń regularnych wysokiego poziomu. Umożliwia to korzystanie z usługi . Kompilator just in time (JIT) platformy NET w celu przekonwertowania wyrażenia na natywny kod maszyny w celu zwiększenia wydajności. Koszt konstruowania Regex obiektu może być wyższy, ale koszt wykonywania dopasowań z nim może być znacznie mniejszy.
Wyrażenia regularne generowane przez źródło
Generowanie źródła dla wyrażeń regularnych jest dostępne na platformie .NET 7 i nowszych wersjach. Generator źródłowy emituje jako kod języka C# niestandardową Regex
implementację pochodną z logiką podobną do tego, co RegexOptions.Compiled
emituje w języku IL. Uzyskasz wszystkie korzyści z RegexOptions.Compiled
wydajności przepływności i korzyści Regex.CompileToAssembly
z uruchamiania programu , ale bez złożoności CompileToAssembly
programu . Źródło, które jest emitowane, jest częścią projektu, co oznacza, że można go również łatwo wyświetlać i debugować.
Jeśli to możliwe, użyj wyrażeń regularnych generowanych przez źródło zamiast kompilowania wyrażeń regularnych przy użyciu RegexOptions.Compiled opcji . Aby uzyskać więcej informacji na temat wyrażeń regularnych generowanych przez źródło, zobacz Generatory źródeł wyrażeń regularnych platformy .NET.
Pamięć podręczna wyrażeń regularnych
Aby zwiększyć wydajność, aparat wyrażeń regularnych utrzymuje pamięć podręczną całej aplikacji skompilowanych wyrażeń regularnych. Pamięć podręczna przechowuje wzorce wyrażeń regularnych, które są używane tylko w wywołaniach metod statycznych. (Wzorce wyrażeń regularnych dostarczone do metod wystąpień nie są buforowane). Buforowanie pozwala uniknąć konieczności ponownej analizy wyrażenia w kodzie bajtów wysokiego poziomu za każdym razem, gdy jest używany.
Maksymalna liczba buforowanych wyrażeń regularnych jest określana przez wartość static
właściwości (Shared
w Visual Basic). Regex.CacheSize Domyślnie aparat wyrażeń regularnych buforuje maksymalnie 15 skompilowanych wyrażeń regularnych. Jeśli liczba skompilowanych wyrażeń regularnych przekracza rozmiar pamięci podręcznej, co najmniej ostatnio używane wyrażenie regularne zostanie odrzucone, a nowe wyrażenie regularne jest buforowane.
Aplikacja może ponownie używać wyrażeń regularnych na jeden z następujących dwóch sposobów:
- Używając statycznej Regex metody obiektu do zdefiniowania wyrażenia regularnego. Jeśli używasz wzorca wyrażenia regularnego, który został już zdefiniowany przez inne wywołanie metody statycznej, aparat wyrażeń regularnych spróbuje pobrać go z pamięci podręcznej. Jeśli nie jest ona dostępna w pamięci podręcznej, aparat skompiluje wyrażenie regularne i doda je do pamięci podręcznej.
- Dzięki ponownemu użyciu istniejącego Regex obiektu, o ile jest potrzebny wzorzec wyrażenia regularnego.
Ze względu na nakład pracy związany z tworzeniem wystąpień obiektów i kompilacją wyrażeń regularnych tworzenie i szybkie niszczenie wielu Regex obiektów jest kosztownym procesem. W przypadku aplikacji korzystających z dużej liczby różnych wyrażeń regularnych można zoptymalizować wydajność przy użyciu wywołań metod statycznych Regex
i ewentualnie przez zwiększenie rozmiaru pamięci podręcznej wyrażeń regularnych.