Как измерить время выполнения кода
Короткий ответ
Запомните 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.