Исправляем Stopwatch в Java: отсчет времени в миллисекундах
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Если вы хотите измерить время с высокой точностью в Java, вы можете использовать метод System.nanoTime()
. Вот пример простой реализации секундомера:
public class Stopwatch {
private long start = System.nanoTime();
public long elapsedMillis() {
return (System.nanoTime() – start) / 1_000_000;
}
public static void main(String[] args) {
Stopwatch sw = new Stopwatch();
// Вставьте здесь код, время исполнения которого требуется измерить.
System.out.println("Прошедшее время: " + sw.elapsedMillis() + " мс");
}
}
Создав экземпляр класса Stopwatch
, вы сразу же начнёте отсчёт времени. Для определения уже прошедшего времени используйте метод elapsedMillis()
, он вернёт значение в миллисекундах.
Точность и производительность: компромиссность подхода
При измерении времени в Java создаётся определённый компромисс между точностью и производительностью. Метод System.nanoTime()
обеспечивает достаточно точные измерения, но его частое использование может снизить производительность системы, особенно если вам нужно производить замеры очень часто.
Библиотеки для расширенной работы с секундомером
Для более продвинутых функций вы можете использовать библиотеки, например, StopWatch от Apache Commons или Stopwatch от Guava. Кроме дополнительных возможностей, они предлагают форматированный вывод результатов и возможность выбора альтернативных источников времени для тестирования.
// Пример использования Stopwatch от Guava
Stopwatch stopwatch = Stopwatch.createStarted();
// Код, время исполнения которого требуется измерить
long elapsedMillis = stopwatch.elapsed(TimeUnit.MILLISECONDS);
stopwatch.stop();
System.out.println("Прошедшее время: " + elapsedMillis + " мс");
Если вы работаете со Spring, StopWatch
из модуля spring-core
великолепно впишется в структуру вашего проекта.
Эпоха Java — Instant
и Duration
Современный Java API, предназначенный для работы с датами и временем, предлагает классы Instant
и Duration
. Они обеспечивают измерение времени с высокой точностью и удобное представление результатов в международном формате ISO 8601.
Instant start = Instant.now();
// Здесь должен быть ваш код
Instant end = Instant.now();
Duration timeElapsed = Duration.between(start, end);
System.out.println("Прошедшее время: " + timeElapsed.toMillis() + " мс");
Объекты Instant
и Duration
являются потокобезопасными и неизменяемыми, что делает их отличным инструментом для надёжных измерений времени.
Нюансы измерения времени — остерегайтесь квантовых сюрпризов
Если ваши измерения часто возвращают нулевые значения, возможно, стоит пересмотреть метод измерения. Метод System.nanoTime()
предоставляет относительное время, которое идеально подходит для измерения длительностей, но не предназначено для получения текущих временных меток.
Выбор секундомера — это как выбор суперспособности
Каждый метод измерения времени имеет свои сильные и слабые стороны. System.nanoTime()
прост и удобен в использовании. Если требуются более сложные и функциональные решения, то в этом случае библиотеки, такие как Guava или Spring, могут предложить расширенную функциональность и дополнительные возможности.
Визуализация
Методы измерения времени в Java — вот ваш персонализированный список супергероев со своими уникальными способностями:
Супергерой | Суперспособности | Производительность |
---|---|---|
🏃♂️ System.nanoTime() | Супер-прецизный замер времени | 🚀 Высочайшая |
🏃♀️ System.currentTimeMillis() | Обычные замеры времени | 🏃♀️ Средняя |
🕒 java.util.Timer | Запланированные замеры | 🕒 Умеренная |
Выбирайте метод, высшим образом подходящий вашим требованиям.
// Приготовьтесь к супер-замерам с nanoTime!
long startTime = System.nanoTime();
// Здесь должен быть ваш код
long endTime = System.nanoTime();
long duration = endTime – startTime;
🏁 Готовы? Поехали! 🏁
Полезные материалы
- System (Java Platform SE 8 ) — более подробная информация о методе System.nanoTime.
- StopWatch (Apache Commons Lang 3.14.0 API) — документация библиотеки StopWatch от Apache Commons Lang.
- Stopwatch (Guava: Google Core Libraries for Java 23.0 API) — описание Stopwatch от библиотеки Guava.
- How do I measure time elapsed in Java? – Stack Overflow — обсуждение на Stack Overflow о методах измерения времени в Java.
- StopWatch (Spring Framework 6.1.3 API) — документация секундомера от Spring.