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