Optymalizacja wydajnosci - czy aop pomaga?

0

Polecicie jakieś książki lub szkolenia dla ludzi zainteresowanych tematem?

i od razu pytanie czy użycie aop do metrykowania ma potencjał przyśpieszyć apkę? Zmniejszyć latency?

zamiast

void foo() {
  meterics.report();
  do();
}

void foo() {
  do();
}


@Before("execution * *.foo(..)") beforeFoo() {
  meterics.report();
}

szukam argumentów zeby przekonać innych do pisania metryk za pomoca aop. ;)

6

Z ciekawości to w jaki sposób miałoby to działać szybciej? Pomijając już, że AOP to syf.

1

czemu miałoby przyspieszyć?
przeciez ten kod musi sie wykonac i tak

1
  1. Nie, nie pomaga. Wręcz przeciwnie, AOP wymaga tworzenia proxy więc jeszcze spowolni wszystko
  2. AOP to rak, bardzo cieżko ogarniać co kiedy i czemu się dzieje
2

@Before("execution * *.foo(..)")

Ostro, sublanguage? :D

0

ech, no i widzicie dobrze, ze zapytalem bo lubie AOP i bym cisnal z tym xD

2

@borys.borys.boryss: a czemu chcesz Aop do tego? Moze po prostu chcesz poczuc się magikiem zamiast zrobić coś tak po prostu normalnie?

0

Single Responsibilit

0

No ale powiedzmy, że nagle chcemy włączyć monitorowanie wykonania sobie pewnych określonych metod. Normalnie musimy tam dopisać jakieś linijki kodu a tak wrzucamy sobie metodę i w jakich warunkach ma się wykonać. Mamy zysk na szybkości dodania takiego monitoringu i dodatkowo nie zaśmieca nam kodu.

2

To zależy od implementacji AOP. Jeżeli masz compile-time/load-time weaving, to ten kod fizycznie jest wrzucany w bajtkod i wówczas nie ma narzutu związanego z wołaniem przez proxy.

0

@.andy metryki można łatwo włączyć lub wyłączyć, więc nie ma problemu z tym żeby mieć je zawsze w kodzie. To ta samo jak logi. Przecież nie usuwasz logów z kodu tylko ustawiasz im jakiś level DEBUG ;) Problem AOP jest taki, ze nagle w kodzie dzieją się rzeczy których "nie widać". Wyobraź sobie że coś w tym AOP napisałeś źle i wali wyjątkami albo błędami - nagle ogarniecie gdzie i czemu się to dzieje przestaje być oczywiste.
Serio, dużo wygodniej pracuje się z kodem gdzie wszystko jest explicite, niż kiedy dzieje się jakaś magia, nie wiadomo gdzie, nie wiadomo kiedy, nie wiadomo jak.

Już nawet nie będę wspominać o tym co się dzieje jak masz kilka AOP które opakowują tą samą metodę i zmiana ich kolejności powoduje błędy... :)

2

C'mon, mówisz o optymalizacji ale czy cokolwiek profilerem sprawdzałeś? Wiesz gdzie są opóźnienia?

Co do metryk i logów to każdy przyzwoity framework robi to asynchronicznie, czyli wątek wrzuca logi/metryki na jakąś lekką strukturę in-memory a potem jeden dedytkowany wątek to odsyła do pliku lub API. Sprawdź czy twój framework tak działa.

Sprawa no 2 - jak ktoś loguje 2GB na godzinę to odbija się to na wydajności, sprawdź czy nie logujecie / zbieracie za dużo. Warto od czasu do czasu robić GC nie używanego observability (kto płacił za logi ten wie ;) ).

EDIT: Nigdy nie udało mi się pracować z AOP bez mruczenia pod nosem kur**a kur**a kur**a mimo że staram się nie przeklinać

0

Jak sie zastanawiasz nad optymalizacja wydajnosci, to sobie po prostu wlacz JMH i przetestuj.

0

I skoro już wyliczamy sobie, to warto też sprawdzić jak tam z GC. Może to GC pauzuje a Ci wychodzi latencja w requestach...

0

jak AOP to CTW lub LTW, wtedy nie przyśpieszy ale też nie spowolni. Ja nie uważam, że to rak, rakiem jest metoda w której logika to jakieś 10% a reszta to crap od logowania, security i pomiarów - właśnie po to jest AOP i bardzo dobrze się sprawdzwa, bo później nie ma problemów że ktoś zapomniał pod endpoint podpiąć sprawdzanie uprawnień. Rakiem imho jest logika oparta na AOP.

Podepnij sobie AspectJ, dzięki Springowi, możesz na etapie developmentu korzystać z jego proxy i RTW (runtime time weaving) a później podmienić implementację na AspectJ z CTW

0

OK, dzieki kolejne pytanie chyba raczej o pamiec.
Czy zamiana boxed type na prymitywy jest warta zachodu i moze przyniesc duzo zysku?
np. double zamiast Double czyli zamiast 8 to 16 bajtow

0
borys.borys.boryss napisał(a):

Czy zamiana boxed type na prymitywy jest warta zachodu i moze przyniesc duzo zysku?
np. double zamiast Double czyli zamiast 8 to 16 bitow

Ale double nie ma 8 bitów. 8 bitów to ma char

0

Jak przetwarzasz dużo danych i każde pole to wrapper to tak może się to przełożyć na wzrost wydajności na oko 15% ale znów trzeba najpierw zmierzyć ile tego jest a dopiero potem optymalizować.

1

Robienie tweaków wydajnosciowych bez poparcia bechmarkiem jest bliższe wróżeniu z kart niż profesjonaljzmowi.

1

Czy zamiana boxed type na prymitywy jest warta zachodu i moze przyniesc duzo zysku?
np. double zamiast Double czyli zamiast 8 to 16 bajtow

Bardzo złożony i zaawansowany temat https://www.baeldung.com/java-memory-layout
Nigdy mi się nie zdarzyło optymalizować kodu w takim zakresie.

0

Czy zamiana boxed type na prymitywy jest warta zachodu i moze przyniesc duzo zysku?
np. double zamiast Double czyli zamiast 8 to 16 bajtow

Zazwyczaj boxing robi się tez z jakiejś przyczyny, np. kolekcje albo opcjonalne (nullable) pola w DTOsie z REST API, więc też sądze że to nie jest takie łatwe zrobić tu spora optymalizację.

1 użytkowników online, w tym zalogowanych: 0, gości: 1