Jednym z problemów z którym trzeba się zmierzyć podczas pracy programisty to spadek wydajności, na który standardowy środek zaradczy to prosty cache oparty o HashMap’e, w której kluczami są parametr(-y) przesłany do metody. Myślę, że zasada działania jest dość powszechnie znana, ale tak dla pewności ją powtórzę:
- sprawdź czy dal danego argumentu (argumentów) wpis znajduje się w mapie
- jeżeli nie wykonaj metodę
- jeżeli jest to zwróć wartość znalezioną w mapie
Mapa sprawdza się znakomicie, jednak pozostawia mały niesmak w ustach, bo co jeżeli zechcemy zrezygnować z cache’owania tego typu, albo wymyślimy super algorytm dzięki któremu cache nie będzie już potrzebny?
Te i inne problemy opisuje w swoim artykule „Memoization in Java” Tom White, przedstawiając także elegancka refaktoryzację powyższego algorytmu w celu oddzielenia mechanizmu cache’owania od obiektu docelowego. Jednak jego celem jest technika idąca krok dalej, a oparta o wywołaniu metody przez dynamicznie zbudowane proxy (dynamic proxy), które wewnętrznie zbuforuje wynik dla danych argumentów i następnym razem już nie trzeba będzie czekać nieskonńczenie długo na wynik. Jest to szczególnie przydatne w sytuacji, gdy identyczne wyniki są zwracane przez metodę operująca na innej instancji obiektu, porozwalanych w różnych miejscach w kodzie, a poprzednie wywowałnie dawno zgineło w czeluściach garbage-collectora.
I jeszcze jedno – artykuł jest datowany na 2003, więc może się rodzić pytanie skąd ta Java5 w tytule? Otóż wraz z tą wersją jezyka, usprawniono mechanizm dynamicznego proxy na tyle, że działa on 1,5 do 2 razy wolniej od zwykłego wywolłania metody w porównaniu z 40-to krotnym opóźnieniem w przypadku starszych wersji. Wyglada na to, że warto się z tym zmierzyć
Leave a Reply