0Pricing
Java Academy · Урок

Прогрев и итерации

Измеряйте производительность в установившемся режиме

«Прогрев и итерации» — бесплатный урок Java Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.

Прогрев и итерации

JMH измеряет производительность в установившемся режиме — скорость, которой код достигает после полной оптимизации JVM. Для этого сначала выполняются пробные итерации прогрева, а затем настоящие итерации измерения. В этом уроке рассматривается настройка обоих этапов.

Зачем нужен прогрев

Первые вызовы выполняются в интерпретируемом режиме и работают медленно; после компиляции горячего метода JIT вызовы становятся гораздо быстрее. Если включить медленный запуск в результаты, они будут завышены. Во время итераций прогрева код выполняется, но их значения времени отбрасываются.

@Warmup

@Warmup управляет пробной фазой: количеством итераций и продолжительностью каждой из них.

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 управляет настоящей фазой, результаты которой записываются. Дополнительные итерации сужают доверительный интервал, но увеличивают продолжительность запуска.

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;
    }
}

Итерации и операции

Будьте внимательны с терминами. Итерация — это измеряемый промежуток времени (например, одна секунда). В течение каждого такого промежутка JMH вызывает метод микротеста столько раз, сколько возможно; каждый вызов — это операция. Результат сообщается для одной операции.

Сколько итераций прогрева достаточно

Следите за выводом для каждой итерации. Когда последовательные итерации прогрева перестают меняться, JIT стабилизировался. Если первые несколько итераций измерения всё ещё меняются, добавьте прогрев. Пять итераций прогрева и десять итераций измерения — распространённая отправная точка.

Отдельные запуски добавляют прогрев

Каждый отдельный запуск выполняется в совершенно новой JVM, поэтому в каждом из них повторяется полный прогрев. Несколько запусков одновременно изолируют профили JIT и показывают разброс между JVM — это наиболее честный способ оценить стабильность.

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);
    }
}

Демонстрация эффекта

Этот обычный цикл Java выводит время выполнения каждой партии. Часто первые партии выполняются медленнее последующих, пока JIT компилирует метод, — именно этот эффект устраняется прогревом.

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);
        }
    }
}

По времени и по количеству

По умолчанию итерации основаны на времени и выполняются в течение N секунд. Можно переключиться на фиксированное количество операций с помощью batchSize и режимов одиночного запуска, но обычно используется измерение по времени, поскольку оно адаптируется к скорости компьютера.

Не настраивайте чрезмерно

Очень продолжительные запуски отнимают время, но после достижения установившегося режима почти не повышают точность. Стремитесь к стабильным, воспроизводимым значениям в разных запусках, а не к максимальному числу итераций. Воспроизводимость важнее одной впечатляющей цифры.

Анализ стабилизации

Во время запуска JMH выводит результат каждой итерации. В качественном микротесте результаты итераций прогрева сходятся, а результаты итераций измерения тесно группируются вокруг итогового значения с небольшой погрешностью +/-.

Быстрая проверка

Проверьте, насколько хорошо Вы понимаете прогрев и итерации.

Итоги

Вы научились измерять производительность в установившемся режиме:

  • @Warmup выполняет итерации, результаты которых отбрасываются, чтобы JIT мог выполнить компиляцию.
  • @Measurement выполняет итерации, результаты которых записываются; дополнительные итерации уменьшают интервал погрешности.
  • Итерация — это измеряемый промежуток времени, а каждый вызов внутри него — операция.
  • Несколько запусков с помощью @Fork повторяют прогрев в новых JVM и показывают разброс между JVM.
  • Стремитесь к воспроизводимым и стабильным результатам, а не к максимальной продолжительности запуска.

Часто задаваемые вопросы

Урок «Прогрев и итерации» бесплатный?

Да — полный текст урока «Прогрев и итерации» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.

Чему я научусь в уроке «Прогрев и итерации»?

Измеряйте производительность в установившемся режиме Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Java Academy?

Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Прогрев и итерации»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Java Academy?

Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Зачем нужен JMH
  2. Написание измерения производительности
  3. Прогрев и итерации
  4. Предотвращение удаления неиспользуемого кода
← Назад к Java Academy