Ответ
В 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 не спасёт, ебать мои старые костыли.