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

Ответ

В Java для измерения времени выполнения кода используются несколько подходов в зависимости от требуемой точности.

1. Для простых измерений (миллисекунды): Используйте System.currentTimeMillis(). Подходит для оценки длительных операций.

long startTime = System.currentTimeMillis();
// Выполняемый код
performOperation();
long elapsedTime = System.currentTimeMillis() - startTime;
System.out.println("Время выполнения: " + elapsedTime + " мс");

2. Для высокоточных измерений (наносекунды): Используйте System.nanoTime(). Важно измерять интервалы на одной и той же JVM.

long startNano = System.nanoTime();
// Код для измерения
calculateSomething();
double elapsedSeconds = (System.nanoTime() - startNano) / 1_000_000_000.0;
System.out.printf("Время выполнения: %.6f сек%n", elapsedSeconds);

3. Современный и рекомендуемый способ (Java 8+): Используйте классы java.time.Instant и java.time.Duration для более читаемого и надежного API.

Instant start = Instant.now();
// Операция
processData();
Duration duration = Duration.between(start, Instant.now());
System.out.println("Прошло: " + duration.toMillis() + " мс");
System.out.println("Прошло: " + duration.toNanos() + " нс");

Ответ 18+ 🔞

А, ну это ж классика, блядь! Опять замерить, сколько твой код тормозит, как старая бабка на переходе? Ну давай, разберёмся, как это делают нормальные люди, а не те, кто Thread.sleep(1000) в цикл суёт.

1. Для грубых прикидок, когда наносекунды — это как волосок в жопе слона. Берёшь System.currentTimeMillis(). Это как часы на кухне — врет на пять минут, но для того, чтобы понять, не сгорела ли картошка, сойдёт. Долгие операции, там, запросы к базе, которые идут дольше, чем твоё терпение.

long startTime = System.currentTimeMillis();
// Выполняемый код
performOperation();
long elapsedTime = System.currentTimeMillis() - startTime;
System.out.println("Время выполнения: " + elapsedTime + " мс");

Выполнил, посмотрел — о, 3000 мс. Ну, пиздец, конечно. Но хотя бы понятно, что он не мгновенный.

2. А вот когда нужна точность, будто ты хирург, а не слесарь-распиздяй. Тогда System.nanoTime(), ёпта! Только, смотри, не накосячь: замеряй начало и конец в одной и той же JVM, а то получишь хуй с горы вместо результата.

long startNano = System.nanoTime();
// Код для измерения
calculateSomething();
double elapsedSeconds = (System.nanoTime() - startNano) / 1_000_000_000.0;
System.out.printf("Время выполнения: %.6f сек%n", elapsedSeconds);

Вот это уже серьёзно. Увидишь разницу между 0.000156 и 0.000157 секунды и поймёшь, где у тебя та самая узкая горлышка, которая всё бутылит.

3. Ну и для пафосных современных разработчиков, которые var везде пихают. Java 8+, блядь, подарила нам Instant и Duration. Выглядит красиво, читается легко, под капотом всё то же самое, но уже с человеческим лицом, а не с рожей системного времени.

Instant start = Instant.now();
// Операция
processData();
Duration duration = Duration.between(start, Instant.now());
System.out.println("Прошло: " + duration.toMillis() + " мс");
System.out.println("Прошло: " + duration.toNanos() + " нс");

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