myślę, że to jest źródłem problemu, nie regex wydajność per-SE:
dla każdego żądania, idę przez wszystkich parametrów i sprawdzić z tych wszystkich 500 wyrażeń regularnych
Bez względu na to, jak szybkie będzie twoje regex, wciąż jest dużo pracy. Nie wiem, ile masz parametrów, ale nawet jeśli jest ich tylko kilka, to wciąż sprawdzam tysiące wyrażeń regularnych na żądanie. To może zabić twój procesor.
Oprócz oczywistych rzeczy, jak poprawić skuteczność regex przez prekompilacja i/lub ich uproszczenia, można wykonać następujące czynności, aby zmniejszyć ilość sprawdzania regex:
Zastosowanie pozytywnej walidacji dane wejściowe użytkownika na podstawie typu parametru. Na przykład. jeśli jakiś parametr musi być prostym numerem, nie marnuj czasu na sprawdzanie, czy zawiera złośliwy skrypt XML. Po prostu sprawdź, czy pasuje [0-9] + (lub coś podobnego prostego). Jeśli tak, to jest ok - pomiń sprawdzanie wszystkich 500 wyrażeń regularnych.
Spróbuj znaleźć proste wyrazy regularne, które mogą wyeliminować całe klasy ataków - znajdź wspólne rzeczy w swoich wyrażeń regularnych. Jeśli np. masz 100 wyrażeń regularnych sprawdzających istnienie określonych znaczników HTML, sprawdź, czy zawartość zawiera co najmniej jeden tag HTML. Jeśli tak nie jest, natychmiast oszczędzasz na sprawdzaniu 100 regexps.
Wyniki pamięci podręcznej. Wiele parametrów generowanych w aplikacjach internetowych powtarza się. Nie sprawdzaj tej samej zawartości w kółko, ale pamiętaj o ostatecznym wyniku sprawdzania poprawności. Uważaj, aby ograniczyć maksymalny rozmiar pamięci podręcznej, aby uniknąć ataków DOS.
Należy również pamiętać, że negatywne sprawdzanie poprawności jest zwykle łatwe do ominięcia. Ktoś po prostu zmienia kilka znaków w ich złośliwym kodzie, a twoje wyrazy regularne nie będą się zgadzać. Będziesz musiał rozbudować "bazę" wyrażeń regularnych, aby chronić się przed nowymi atakami. Pozytywna walidacja (biała lista) nie ma tej wady i jest znacznie bardziej efektywna.
Według zrzutu ekranu "checkPattern" został nazwany 212148825 razy w sumie do 6100774ms, co czyni 0.02ms na połączenie. Nie widzę tutaj problemu z wydajnością - i zdecydowanie żadnego dowodu na 500ms na inwokację. –
Jeśli istnieją określone wzorce powodujące dłuższe opóźnienia, należy je zidentyfikować i uwzględnić w pytaniu. – Holger
@ Czas ładowania nie jest problemem. Moje obawy dotyczą tylko obciążenia i użycia procesora. Chcę przetworzyć parametry równoległe, jeśli to zrobiłem, średnia obciążenia przekroczyła> 4.Zrobiłem zrzut wątku, używając 'jstack -l' i znajdując maksymalny wątek zużywający' thread -H -b -p 'i przekonwertowałem id na kod szesnastkowy, wątek zużywający high cpu (50%) jest w stanie uruchomionym w Matcherze .odnaleźć. –
kannanrbk