Kompilacja i ponowne użycie w wyrażeniach regularnych

Możesz zoptymalizować wydajność aplikacji, które intensywnie korzystają z wyrażeń regularnych, rozumiejąc sposób kompilowania wyrażeń regularnych przez aparat wyrażeń regularnych i zrozumienie sposobu buforowania wyrażeń regularnych. W tym temacie omówiono zarówno kompilację, jak i buforowanie.

Skompilowane 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.

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.

Alternatywą jest użycie wstępnie skompilowanych wyrażeń regularnych. Wszystkie wyrażenia można skompilować do biblioteki DLL wielokrotnego użytku przy użyciu CompileToAssembly metody . Pozwala to uniknąć konieczności kompilowania w czasie wykonywania, jednocześnie korzystając z szybkości skompilowanych wyrażeń regularnych.

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). Pozwala to 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 bardzo 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.

Zobacz też