logo

Исправляем Stopwatch в Java: отсчет времени в миллисекундах

Быстрый ответ

Если вы хотите измерить время с высокой точностью в Java, вы можете использовать метод System.nanoTime(). Вот пример простой реализации секундомера:

Java
Скопировать код
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. Кроме дополнительных возможностей, они предлагают форматированный вывод результатов и возможность выбора альтернативных источников времени для тестирования.

Java
Скопировать код
// Пример использования 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.

Java
Скопировать код
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Запланированные замеры🕒 Умеренная

Выбирайте метод, высшим образом подходящий вашим требованиям.

Java
Скопировать код
// Приготовьтесь к супер-замерам с nanoTime!
long startTime = System.nanoTime();
// Здесь должен быть ваш код
long endTime = System.nanoTime();
long duration = endTime – startTime;

🏁 Готовы? Поехали! 🏁

Полезные материалы

  1. System (Java Platform SE 8 ) — более подробная информация о методе System.nanoTime.
  2. StopWatch (Apache Commons Lang 3.14.0 API) — документация библиотеки StopWatch от Apache Commons Lang.
  3. Stopwatch (Guava: Google Core Libraries for Java 23.0 API) — описание Stopwatch от библиотеки Guava.
  4. How do I measure time elapsed in Java? – Stack Overflow — обсуждение на Stack Overflow о методах измерения времени в Java.
  5. StopWatch (Spring Framework 6.1.3 API) — документация секундомера от Spring.