Optymalizacja if statement

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.

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.

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.

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