0Pricing
Java Academy · Lekcja

Rozgrzewka i iteracje

Pomiar wydajności w stanie ustalonym

Rozgrzewka i iteracje to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.

Rozgrzewka i iteracje

JMH mierzy wydajność w stanie ustalonym: szybkość osiąganą przez kod po pełnym zoptymalizowaniu przez JVM. W tym celu najpierw wykonuje odrzucane iteracje rozgrzewkowe, a następnie rzeczywiste iteracje pomiarowe. W tej lekcji omówiono dostrajanie obu rodzajów iteracji.

Dlaczego rozgrzewać kod

Pierwsze wywołania są interpretowane i wolne, a po skompilowaniu często wykonywanej metody przez JIT wywołania stają się znacznie szybsze. Uwzględnienie powolnego uruchomienia w wynikach zawyżyłoby je. Iteracje rozgrzewkowe wykonują kod, ale ich czasy są odrzucane.

@Warmup

@Warmup steruje odrzucaną fazą: określa liczbę iteracji i czas trwania każdej z nich.

import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.*;

public class Bench {
    @Benchmark
    @Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
    public int work() {
        return 7 * 6;
    }
}

@Measurement

@Measurement steruje rzeczywistą fazą, której wyniki są zapisywane. Większa liczba iteracji zawęża przedział ufności, ale wydłuża wykonanie.

import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.*;

public class Bench {
    @Benchmark
    @Measurement(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
    public int work() {
        return 7 * 6;
    }
}

Iteracje a operacje

Należy uważać na te pojęcia. Iteracja to mierzony przedział czasu, na przykład jedna sekunda. W każdym takim przedziale JMH wywołuje metodę benchmarku tyle razy, ile jest możliwe; każde wywołanie jest operacją. Wynik jest raportowany w przeliczeniu na operację.

Ile rozgrzewek wystarczy

Należy obserwować wyniki poszczególnych iteracji. Gdy kolejne iteracje rozgrzewkowe przestają się zmieniać, JIT osiągnął stabilny stan. Jeśli wyniki pierwszych kilku iteracji pomiarowych nadal się zmieniają, należy dodać więcej rozgrzewki. Pięć iteracji rozgrzewkowych i dziesięć iteracji pomiarowych to częsty punkt wyjścia.

Forki zapewniają dodatkową rozgrzewkę

Każdy fork uruchamia zupełnie nową JVM, dlatego w każdym forku powtarzana jest pełna rozgrzewka. Kilka forków izoluje profile JIT, a także pokazuje zmienność między JVM, co jest najbardziej miarodajnym sposobem oceny stabilności.

import org.openjdk.jmh.annotations.*;

@Fork(3)
@Warmup(iterations = 5)
@Measurement(iterations = 10)
public class Bench {
    @Benchmark
    public double sqrt() {
        return Math.sqrt(2.0);
    }
}

Pokazanie efektu

Ta zwykła pętla Java wyświetla czasy poszczególnych partii. Często można zaobserwować, że pierwsze partie wykonują się wolniej niż późniejsze, gdy JIT kompiluje metodę — dokładnie ten efekt, który jest odrzucany podczas rozgrzewki.

public class Main {
    static long busy(int n) {
        long s = 0;
        for (int i = 0; i < n; i++) s += (long) Math.sqrt(i);
        return s;
    }
    public static void main(String[] args) {
        for (int batch = 0; batch < 5; batch++) {
            long t = System.nanoTime();
            long r = busy(2_000_000);
            System.out.println("batch " + batch + ": "
                + (System.nanoTime() - t) / 1000 + " us, r=" + r);
        }
    }
}

Tryb oparty na czasie a tryb oparty na liczbie operacji

Domyślnie iteracje są oparte na czasie (wykonywane przez N sekund). Za pomocą batchSize i trybów jednorazowych można przełączyć się na stałą liczbę operacji, ale tryb oparty na czasie jest standardem, ponieważ dostosowuje się do szybkości maszyny.

Nie dostrajać przesadnie

Bardzo długie wykonania zajmują czas, nie zwiększając znacząco dokładności po osiągnięciu stanu ustalonego. Należy dążyć do stabilnych i powtarzalnych wyników między forkami, zamiast maksymalizować liczbę iteracji. Powtarzalność jest ważniejsza niż pojedyncza imponująca wartość.

Odczytywanie stabilizacji

JMH wyświetla wynik każdej iteracji podczas wykonania. Prawidłowy benchmark pokazuje zbieganie wyników iteracji rozgrzewkowych oraz ścisłe skupienie wyników iteracji pomiarowych wokół wyniku końcowego z niewielkim błędem +/-.

Szybki test

Proszę sprawdzić zrozumienie rozgrzewki i iteracji.

Podsumowanie

Nauczyli się Państwo mierzyć wydajność w stanie ustalonym:

  • @Warmup wykonuje odrzucane iteracje, aby JIT mógł skompilować kod.
  • @Measurement wykonuje rejestrowane iteracje pomiarowe; większa ich liczba zawęża zakres błędu.
  • Iteracja to mierzony przedział czasu, a każde wywołanie w jej ramach jest operacją.
  • Wiele forków @Fork powtarza rozgrzewkę w nowych JVM i ujawnia zmienność między JVM.
  • Należy dążyć do powtarzalnych, stabilnych wyników, a nie do maksymalnego czasu wykonania.

Często zadawane pytania

Czy lekcja „Rozgrzewka i iteracje” jest bezpłatna?

Tak — pełny tekst „Rozgrzewka i iteracje” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Rozgrzewka i iteracje”?

Pomiar wydajności w stanie ustalonym Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Java Academy?

Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Rozgrzewka i iteracje”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?

Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Dlaczego JMH
  2. Pisanie benchmarku
  3. Rozgrzewka i iteracje
  4. Unikanie eliminacji martwego kodu
← Powrót do Java Academy