Зачастую требуется узнать, сколько времени выполняется тот или иной код. Иногда требуется замерить время выполнения метода или какой-то задачи. В данной статье мы расскажем вам принципы замера времени в Java и покажем лучшие практики для конкретных задач.
Замер времени с помощью currentTimeMills()
Это довольно простой способ измерить время. Метод System.currentTimeMillis() вернёт вам текущее время в миллисекундах. Его потребуется вызвать до выполнения нужной задачи и после, а затем вычислить разницу. В итоге мы узнаем время выполнения в миллисекундах:
long start = System.currentTimeMillis(); // выполнение какой-то логики Thread.sleep(1000); long finish = System.currentTimeMillis(); long elapsed = finish — start; System.out.println(«Прошло времени, мс: » + elapsed);
При работе с данным методом следует учитывать его специфику: System.currentTimeMillis() показывает текущее время, основываясь на системных часах и может выдавать некорректный результат.
Замер времени с помощью nanoTime()
Ещё один метод для получения текущего времени это System.nanoTime(). Как следует из названия, этот метод возвращает время с точностью до нансекунд. Также работа этого метода не зависит от системных часов.
Как измерить время выполнения кода | Изучение С++ для начинающих. Урок #145
Он используется аналогично:
long start = System.nanoTime(); // выполнение какой-то логики Thread.sleep(1000); long finish = System.nanoTime(); long elapsed = finish — start; System.out.println(«Прошло времени, нс: » + elapsed);
Для получения значения в миллисекундах результат можно разделить на 1000:
System.out.println(«Прошло времени, мс: » + elapsed / 1000000);
Важно: Хотя метод nanoTime() может возвращать время в наносекундах, он не гарантирует, что значения между его вызовами будут обновляться с точностью до наносекунд.
Но всё же это более приемлемый вариант, чем System.currentTimeMillis().
Замер времени с помощью Instant и Duration
В Java 8 добавили новый java.time API. В частности, ля измерения времени подойдут два новых класса – Instant и Duration. Оба эти класса иммутабельны.
Instant обозначает момент времени с начала эпохи Unix (1970-01-01T00:00:00Z). Для создания момента мы используем метод Instant.now(). После того, как мы создали два момент, вычислим разницу в миллисекундах:
Instant start = Instant.now(); // выполнение какой-то логики Thread.sleep(1000); Instant finish = Instant.now(); long elapsed = Duration.between(start, finish).toMillis(); System.out.println(«Прошло времени, мс: » + elapsed);
Рекомендуется использовать именно этот подход в Java 8 и выше.
Замер времени выполнения с помощью StopWatch
StopWatch – это класс из библиотеки Apache Commons Lang. Он работает как секундомер. Для его использования сначала требуется подключить библиотеку к проекту:
org.apache.commons commons-lang3 3.9
Теперь создадим экземпляр StopWatch. Затем начнём отсчёт с помощью метода start() и окончим отсчёт с помощью метода stop():
Ответы на вопросы 3: Замер времени исполнения программы.
public static void stopWatch() throws InterruptedException < StopWatch stopWatch = new StopWatch(); stopWatch.start(); // выполнение какой-то логики Thread.sleep(1000); stopWatch.stop(); System.out.println(«Прошло времени, мс: » + stopWatch.getTime()); >
StopWatch удобно использовать тогда, когда в проекте уже подключена данная библиотека.
Исходный код
package ru.javalessons.time; import org.apache.commons.lang3.time.StopWatch; import java.time.Duration; import java.time.Instant; public class MeasureElapsedTime < public static void main(String[] args) throws InterruptedException < currentTimeMillis(); nanoTime(); instant(); stopWatch(); >public static void currentTimeMillis() throws InterruptedException < long start = System.currentTimeMillis(); // выполнение какой-то логики Thread.sleep(1000); long finish = System.currentTimeMillis(); long elapsed = finish — start; System.out.println(«Прошло времени, мс: » + elapsed); >public static void nanoTime() throws InterruptedException < long start = System.nanoTime(); // выполнение какой-то логики Thread.sleep(1000); long finish = System.nanoTime(); long elapsed = finish — start; System.out.println(«Прошло времени, нс: » + elapsed); >public static void instant() throws InterruptedException < Instant start = Instant.now(); // выполнение какой-то логики Thread.sleep(1000); Instant finish = Instant.now(); long elapsed = Duration.between(start, finish).toMillis(); System.out.println(«Прошло времени, мс: » + elapsed); >public static void stopWatch() throws InterruptedException < StopWatch stopWatch = new StopWatch(); stopWatch.start(); // выполнение какой-то логики Thread.sleep(1000); stopWatch.stop(); System.out.println(«Прошло времени, мс: » + stopWatch.getTime()); >>
Заключение
В данной статье мы разобрали простые методы замера времени выполнения в Java. Для простых замеров можно использовать все вышеперечисленные методы, кроме currentTimeMillis (из-за того, что он зависит от системных часов).
Как замерить время выполнения
- ← Как заменить пробелы между словами в строке
- Как узнать версию OpenSSH →
Источник: java-lessons.ru
⏱ Измеряем время выполнения кода в Java с помощью StopWatch
Чтобы написать хорошее приложение, важно измерять время выполнения кода. Так вы сможете планировать ваши дальнейшие действия, учитывая время.
В многопоточных системах также полезно измерять время выполнения отдельных потоков ( Thread ) или асинхронных задач.
Поскольку в Java нет встроенного способа измерения времени выполнения строчного кода, мы использовали инструмент StopWatch .
В этом уроке мы рассмотрим, как измерить время выполнения кода на Java с помощью StopWatch.
Что такое StopWatch?
StopWatch – это служебный класс, находящийся в пакете util . У него очень простой API, он даёт нам возможность определять время выполнения отдельных задач, групп задач и общее время выполнения программы.
Этот класс обычно используется для проверки производительности кода на этапе разработки.
Примечание: StopWatch непотокобезопасен.
Он отслеживает время в наносекундах, полагаясь на System.nanoTime() .
Измеряем время выполнения кода с помощью StopWatch
Секундомер относится к базовому пакету утилит Spring:
org.springframework spring-core
Также он есть в spring-boot-starter-web :
org.springframework.boot spring-boot-starter-web
API StopWatch сводится к созданию экземпляра и вызову start() и stop() : так он синхронизирует код с реальным секундомером. При синхронизации вы также можете указать строку, которая будет использоваться в качестве имени или аннотации для связанной задачи. Это помогает дифференцировать их результаты.
Задача – это период между вызовом start() и stop() . Для каждой задачи, созданной при запуске StopWatch , её имя и время выполнения сохраняются в экземпляре TaskInfo и добавляются в список задач.
Создадим задачу с именем и измерим время выполнения части кода:
StopWatch timeMeasure = new StopWatch(); timeMeasure.start(«Task 1»); Thread.sleep(1000); timeMeasure.stop(); System.out.println(«Last task time in Millis: » + timeMeasure.getLastTaskMillis());
Last task time in Millis: 1009
Вы можете получить доступ к сумме всех задач с помощью функций getTotalTimeSeconds() , getTotalTimeMillis() и getTotalTimeNanos() .
Вы также можете получить доступ к последней задаче StopWatch через getLastTaskInfo() , который выводит экземпляр TaskInfo . Этот экземпляр содержит информацию о последней задаче, например, имя и сколько времени она заняла в секундах, миллисекундах и наносекундах:
StopWatch stopWatch = new StopWatch(); stopWatch.start(«Task 1»); Thread.sleep(1000); stopWatch.stop(); System.out.println(stopWatch.getLastTaskInfo().getTaskName()); System.out.println(stopWatch.getLastTaskInfo().getTimeMillis());
Task 1 1008
При решении нескольких задач удобно использовать метод prettyPrint() , который печатает все записи в табличном виде с простым форматированием:
StopWatch stopWatch = new StopWatch(«Measure Code Execution»); stopWatch.start(«1. Task»); Thread.sleep(2000); stopWatch.stop(); stopWatch.start(«2. Task»); Thread.sleep(5000); stopWatch.stop(); stopWatch.start(«3. Task»); Thread.sleep(3000); stopWatch.stop(); System.out.println(stopWatch.prettyPrint());
StopWatch ‘Measure Code Execution’: running time = 10012348500 ns ——————————————— ns % Task name ——————————————— 2002729600 020% 1. Task 5006985700 050% 2. Task 3002633200 030% 3. Task
Примечание: если мы используем секундомер для измерения времени выполнения кода для большого количества интервалов (порядка сотен тысяч или миллионов) – список TaskInfo займёт значительную часть вашей памяти. Вы можете отключить его так:
stopWatch.setKeepTaskList(false);
Заключение
В этом уроке мы рассмотрели класс утилиты StopWatch – ответ Spring на отсутствие инструментов измерения времени в Java.
Источник: uproger.com
Измерьте прошедшее время (или время выполнения) в Java
В этом посте будет обсуждаться, как измерить прошедшее время в Java, используя System.nanoTime() , System.currentTimeMillis() , Instant.now() а также StopWatch предоставлено Guava и Apache Commons Lang.