2011-06-30 19 views
5

Gdy chcesz wycisnąć z kodu ostatni fragment wydajności, najlepiej wykorzystać optymalizację JIT. Na przykład, finalizacja metody znakowania dla łatwego wstawiania metod, unikanie polimorfizmu w krytycznych miejscach, itp.Jak pisać przyjazny kod optymalizacji Java JIT?

Ale nie mogłem znaleźć żadnego odniesienia ani listy opcji, które programista java mógłby użyć, aby "podpowiedzieć" kompilator JIT dla szybszego kod? Czy nie powinniśmy mieć listę "najlepszych programów" dla niskich opóźnień z JIT?

+0

Nie jest to odpowiedź na twoje pytanie, ale jeśli interesuje cię wysokowydajna Java, być może zainteresuje Cię mało znana biblioteka [fastutil] (http://fastutil.dsi.unimi.it/). Jest to wydajne rozszerzenie frameworka kolekcji. –

+0

Czy możesz wyjaśnić, dlaczego jesteś tym zainteresowany? Czy masz problem z wydajnością? czy jest to czysto akademickie? :-) – drekka

+0

Problemy z wydajnością, które mam, mogą być w większości naprawione przez dostrojenie GC lub ulepszenie algorytmu. Gdybym jednak musiał wyjść poza to, na przykład przetwarzanie obrazów, rozpoznawanie wzorów itp., Chciałbym wiedzieć, jakie są inne narzędzia optymalizacji wydajności, które mam w ręku. Możesz nazwać to akademickim. – Sajid

Odpowiedz

7

Autorzy HotSpot i inni wielokrotnie stwierdzili, że najlepszym sposobem jest napisanie prostego kodu.

+1

+1: JIT szuka wspólnych wzorów, które wie, jak optymalizować. Jeśli napiszesz mylący kod lub kod z nietypowymi konstrukcjami, to zmyli JIT (który jest łatwy do wykonania, to tylko program) i nie zoptymalizuje również kodu. –

10

Najlepszym sposobem napisania kodu zgodnego z JIT jest napisanie prostego kodu, ponieważ właśnie tego szuka JIT i wie, jak go zoptymalizować. Bez żadnych sztuczek!

Również różne JVM mają różne JIT, więc aby mieć pewność, że twój kod działa dobrze z każdym z nich, nie możesz polegać na żadnym z nich.

Najczęstszym sposobem poprawy wydajności JIT jest zewnętrzna konfiguracja JVM. Ponieważ większość JVM w dzisiejszych czasach wie, jak wprowadzać małe wywołania metodowe, większość zysków z wydajności pochodzi z konfigurowania garbage collectora. Tutaj wiele wysiłku wykorzystuje się, aby uniknąć konieczności zatrzymania programu podczas zbierania, i możesz nieco poprawić swoją wiedzę o tym, jak konfiguruje się podstawowy sprzęt i co działa lepiej niż inne. Ale nie kod Java, musi być prosty i prosty.

+2

Zalecam, aby spróbować znaleźć slajdy lub plik PDF dla "Jawkowych odkrytych mitów wydajności technologii" JavaOne talk by Cliff Click (haker Hotspot, ex-Sun, przez jakiś czas był w Azul Systems). Jego [blog] (http://www.azulsystems.com/blog/) również zawsze ma interesujące dyskusje wewnętrzne JVM. I, z drugiej strony, "metody tworzenia ostateczne, które pomagają w inlineing" "optymalizacji" to tylko mit. – vanza

+0

@vanza Cóż, slajdy są niezwykle trudne do znalezienia. Ale jest co najmniej jedna zaleta ostatecznej metody: JIT nie musi w jakiś sposób wnioskować, że nie ma odpowiedniej podklasy, ale zawsze można uniknąć dynamicznego wywołania - co powinno w niektórych przypadkach przynieść niewielki wzrost wydajności. Nie, że będzie to zauważalne, ale hej;) – Voo

+1

@ Voo: Hotspot już unika dynamicznych wywołań, gdy tylko jest to możliwe (np. Interfejs lub klasa abstrakcyjna z pojedynczą załadowaną klasą betonu, która ją implementuje), "końcowy" nie jest potrzebny. W duchu oryginalnej wiadomości i tego, co zawsze słyszałem od hakerów JIT: używaj "końcowych" (i innych funkcji językowych), gdy ma to sens w kodzie, nie dlatego, że uważasz, że przyspieszy to twój kod. – vanza