Java StopWatch: расчет времени выполнения

Секундомер — это удобный инструмент для измерения времени выполнения методов, помогающий нам отслеживать прошедшее время, затраченное на обработку частей запроса. В этой статье мы рассмотрим, как создать простой секундомер в Java.

1. Реализация пользовательского секундомера в Java 8

Начиная с Java 8, мы используем класс java.time.Instant для захвата текущего времени с точностью до наносекунды. Чтобы вычислить время выполнения операций программы, мы можем захватить текущее время до начала выполнения программы и после завершения выполнения программы.

Зная разницу между временем начала и окончания, мы можем рассчитать время выполнения программы.

Stopwatch stopwatch = new Stopwatch();stopwatch.start();// ...stopwatch.stop();long millis = stopwatch.getElapsedTime();long nanos = stopwatch.getElapsedTime(TimeUnit.NANOSECONDS);

Для реализации пользовательского секундомера мы создали класс Stopwatch, который записывает время начала и время окончания, когда мы вызываем методы start() и stop(). Если мы не вызываем метод stop(), он возвращает время, прошедшее с момента вызова метода start().

 публичный финальный класс Секундомер {частный Мгновенный startTime;личное Мгновенное время окончания;частный логический запуск;публичный void start() {если(!работает) {startTime = Instant.now();работает = правда;} еще {System.out.println("Секундомер уже запущен. Используйте stop() перед повторным запуском.");}}публичная недействительная остановка() {если(работает) {endTime = Instant.now();работает = ложь;} еще {System.out.println("Секундомер не запущен. Перед остановкой используйте start().");}}публичная Продолжительность getElapsedDuration() {если(работает) {вернуть Продолжительность.between(startTime, Instant.now());} еще {вернуть Продолжительность.between(время начала, время окончания);}}публичный длинный getElapsedTime() {Продолжительность продолжительность = getElapsedDuration();вернуть продолжительность.toMillis();}public long getElapsedTime(TimeUnit timeUnit) {return timeUnit.convert(getElapsedTime(), TimeUnit.MILLISECONDS);}}

2. StopWatch от Apache Common

Библиотека Apache Commons Lang3 предоставляет встроенную реализацию класса org.apache.commons.lang3.time.StopWatch, которую мы можем использовать непосредственно в коде. Шаблон использования аналогичен тому, который мы обсуждали для пользовательского секундомера.

import org.apache.commons.lang3.time.StopWatch;//...Stopwatch stopwatch = new Stopwatch();stopwatch.start();// ...stopwatch.stop();long millis = stopwatch.getElapsedTime();long nanos = stopwatch.getElapsedTime(TimeUnit.NANOSECONDS);

Этот секундомер предоставляет дополнительные функции, такие как:

  • Его можно приостанавливать и возобновлять с помощью методов suspend() и resume(), поэтому один и тот же экземпляр секундомера можно использовать для расчета времени выполнения в разных частях кода. Любое время между приостановкой и возобновлением не будет учитываться в общем.
  • Он может быть создан в запущенном режиме с помощью метода createStarted(). Таким образом, нам не нужно вызывать метод start() явно.
  • Его метод split() помогает часам получать время, пока часы продолжают работать в фоновом режиме. Метод unsplit() уберет эффект разделения.
  • Он принудительно вызывает методы в соответствующем порядке, поэтому теперь вы не можете вызвать stop перед start, resume перед suspend или unsplit перед split.

Но учтите, что этот секундомер не является потокобезопасным.

3. Заключение

В этом кратком руководстве по Java обсуждалось, как реализовать и использовать функциональность StopWatch в Java. Мы создали пользовательскую минимальную реализацию StopWatch для простых вариантов использования. Для сложных вариантов использования нам следует использовать класс Apache Commons StopWatch.

Исходный код на Github

Прокрутить вверх