Optymalizacja if statement

Optymalizacja if statement
ME
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:4
0

Jak najlepiej optymalizowac ify?

Czy zagniezdzanie ifow jest bardziej wydajne nijezeli tworzenie dlugich warunkow w jednym ifie?

PS. Pisze to w kategorii javy, jesli jest to nie poprawne to prosze o przeniesienie.

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
0

Odpal profiler i optymalizuj aplikację zgodnie z tym, co on Ci pokaże - nie zgaduj. że a pewnie ten if zajmie dużo cykli, to go rozbiję.

Pamiętaj też o tym, że premature optimization is the root of all evil.


edytowany 2x, ostatnio: Patryk27
KR
Moderator
  • Rejestracja:około 21 lat
  • Ostatnio:dzień
  • Postów:2964
3

Czy zagniezdzanie ifow jest bardziej wydajne nijezeli tworzenie dlugich warunkow w jednym ifie?

Podaj konkretny przykład, bo nie rozumiem jak one mogą być równoważne.

Proste porównania na intach oraz operacje logiczne kosztują zwykle 1 cykl CPU, czyli są bardzo, bardzo tanie i raczej nigdy nie są problemem wydajnościowym. Poza tym przy niezależnych porównaniach czasami można puścić dwie lub więcej operacji na dwóch różnych jednostkach obliczeniowych, więc sumarycznie może wyjść mniej cykli niż z prostego podsumowania operacji, które masz w warunku.

Natomiast sam skok warunkowy, który jest wykonywany po obliczeniu warunku może zajmować od 1 cyklu do kilkunastu w zależności od tego czy został dobrze przewidziany.
Warunki mocno niesymetryczne, w których jedna gałąź wykonuje się 99% przypadków są zwykle niemal darmowe.
Warunki, których wynik jest losowy / trudny do przewidzenia są kosztowne, i można się spodziewać że w połowie przypadków zapłacisz te kilkanaście cykli za złe przewidzenie skoku. Niemniej, bardzo dawno spotkałem się z kodem, w którym faktycznie to byłby jakiś problem. Nowoczesne BPU są bardzo dobre i o ile celowo nie robisz im na złość jakimś randomem - radzą sobie nieźle nawet w dość nieoczywistych przypadkach.

I jeszcze taka rada: W przypadku warunków mocno niesymetrycznych, gałąź zimną należy wyrzucić do osobnej metody - nie należy mieszać kodu zimnego z gorącym (jest wiele powodów - np. działanie hotspota, inlining, cache kodu). Usunięcie zimnego kodu z głównej ścieżki wykonania kodu bardzo mocno usprawnia inlining i może mieć znacznie większy wpływ na wydajność niż jakieś stylistyczne zabawy w obrębie jednej metody.

Co do profilowania - na tym poziomie ciężko to zrobić dobrze. Polecam async-profiler lub w ostateczności JFR. Wszelkie JVisualVMy, wtyczki do IDE i inne profilery oparte na interfejsie JVMTI tj. samplowaniu stosu JVM lub instrumentacji bajtkodu będą w takim niskopoziomowym przypadku bardzo niedokładne (samplują tylko na safepointach, wprowadzają duży narzut na pobranie timestampów), wręcz bezużyteczne i tylko Cię doprowadzą do mylnych wniosków.

Jak lubisz ekstremalną zabawę, to możesz też sobie uruchomić opcję -XX:+PrintAssembly i podejrzeć co JVM faktycznie wykonuje.

edytowany 4x, ostatnio: Krolik

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.