Wskazówki dotyczące pisania mikroprocesorów od twórców Java HotSpot :
Zasada 0: Przeczytaj renomowany artykuł na temat maszyn JVM i mikro-benchmarkingu. Dobrym jest Brian Goetz, 2005 . Nie oczekuj zbyt wiele od mikro-testów; mierzą tylko ograniczony zakres charakterystyki wydajności JVM.
Reguła 1: Zawsze dołączaj fazę rozgrzewki, która uruchamia jądro testowe przez cały czas, wystarczającą do uruchomienia wszystkich inicjalizacji i kompilacji przed fazami czasowymi. (Mniej iteracji jest w porządku w fazie rozgrzewania. Zasadą jest kilkadziesiąt tysięcy iteracji w wewnętrznej pętli).
Zasada nr 2: Zawsze uruchamiaj z -XX:+PrintCompilation
, -verbose:gc
itd, więc można sprawdzić, że kompilator i inne części JVM nie robią nieoczekiwany prace podczas fazy rozrządu.
Reguła 2.1: Drukuj wiadomości na początku i na końcu faz synchronizacji i rozgrzewki, abyś mógł sprawdzić, czy nie ma wyjścia z reguły 2 podczas fazy synchronizacji.
Zasada 3: Bądź świadomy różnicy między -client
i -server
, a OSR i regularnymi kompilacjami. -XX:+PrintCompilation
Flaga informuje OSR składanki z co-znak oznaczający zakaz początkowy punkt wejścia, np Trouble$1::run @ 2 (41 bytes)
. Preferuj serwer od klienta, a normalnie OSR, jeśli zależy Ci na najlepszej wydajności.
Zasada 4: Bądź świadomy efektów inicjalizacji. Nie drukuj po raz pierwszy podczas fazy pomiaru czasu, ponieważ drukowanie ładuje i inicjuje klasy. Nie ładuj nowych klas poza fazą rozgrzewki (lub końcową fazą raportowania), chyba że testujesz ładowanie klas konkretnie (iw takim przypadku ładuj tylko klasy testowe). Zasada 2 jest pierwszą linią obrony przed takimi efektami.
Zasada 5: Bądź świadomy efektów deoptimizacji i rekompilacji. Nie bierz żadnej ścieżki kodu po raz pierwszy w fazie synchronizacji, ponieważ kompilator może śmieci i ponownie skompilować kod, w oparciu o wcześniejsze optymistyczne założenie, że ścieżka nie będzie w ogóle używana. Zasada 2 jest pierwszą linią obrony przed takimi efektami.
Reguła 6: Użyj odpowiednich narzędzi, aby odczytać zdanie kompilatora i spodziewaj się zaskoczenia kodem, który produkuje. Sprawdź sam kod przed sformułowaniem teorii na temat tego, co czyni coś szybszym lub wolniejszym.
Zasada 7: Zmniejsz hałas w pomiarach. Uruchom test porównawczy na cichej maszynie i uruchom go kilka razy, odrzucając wartości odstające. Użyj -Xbatch
do serializacji kompilatora z aplikacją i rozważ ustawienie, -XX:CICompilerCount=1
aby uniemożliwić równoległe działanie kompilatora. Postaraj się zmniejszyć obciążenie GC, ustaw Xmx
(wystarczająco duży) równość Xms
i użyj, UseEpsilonGC
jeśli jest dostępny.
Zasada 8: Użyj biblioteki do testu porównawczego, ponieważ jest ona prawdopodobnie bardziej wydajna i została już debugowana wyłącznie w tym celu. Takich jak JMH , Caliper lub Bill and Paul's Excellent UCSD Benchmarks for Java .