Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как измерить время выполнения кода

Короткий ответ

Запомните System.nanoTime() до и после кода и вычтите одно из другого:

void main() throws InterruptedException {
    long start = System.nanoTime();
    Thread.sleep(150);
    long elapsedMs = (System.nanoTime() - start) / 1_000_000;
 
    IO.println("Took " + elapsedMs + " ms");
}

Результат:

Took 172 ms

Точное число миллисекунд у вас будет немного другим.

Через Duration

Duration.ofNanos() превращает разницу в удобный объект:

void main() {
    long start = System.nanoTime();
    long sum = 0;
    for (int i = 0; i < 50_000_000; i++) {
        sum += i;
    }
    Duration elapsed = Duration.ofNanos(System.nanoTime() - start);
 
    IO.println(sum);
    IO.println(elapsed.toMillis() + " ms");
}

Результат:

1249999975000000
30 ms

Метод-помощник

Оберните замер в метод, который принимает код как Runnable:

void timed(String label, Runnable code) {
    long start = System.nanoTime();
    code.run();
    IO.println(label + ": " + (System.nanoTime() - start) / 1_000_000 + " ms");
}
 
void main() {
    timed("sort", () -> {
        var numbers = new Random(1).ints(1_000_000).toArray();
        Arrays.sort(numbers);
    });
}

Результат:

sort: 250 ms

Частая ошибка

Замерять через System.currentTimeMillis() и делать выводы по одному запуску. Часы системы могут перевести, а первый запуск медленнее из-за прогрева JVM: код компилируется на лету во время работы. Для длительности используйте nanoTime(), а для серьёзного сравнения производительности — библиотеку JMH.

Функции из этого ответа

  • Instant — Точный момент времени на временной шкале UTC — для логов, меток времени и замеров.
  • Duration — Промежуток времени в секундах и наносекундах — часы, минуты, секунды.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.