Автор оригинала: Ognjen Jankovic.
Вступление
Измерение времени выполнения кода-жизненно важный шаг в попытке написать эффективные приложения. Временная осведомленность о вашем коде на машине, которая может обслуживать большое количество пользователей, позволяет вам планировать дальнейшие действия с учетом времени выполнения.
В многопоточных системах также полезно измерять время выполнения отдельных потоков
с или асинхронных задач.
Поскольку в Java нет встроенного удобного способа измерения выполнения кода для решений на основе Spring, мы познакомились с инструментом Секундомер
.
В этом уроке мы рассмотрим как измерить время выполнения кода на Java с помощью секундомера
Spring .
Урок секундомера весны
Секундомер
– это служебный класс, находящийся в пакете util
. Он имеет очень простой API и позволяет нам время именованные задачи, группы задач и общее время работы программы.
Этот класс обычно используется для проверки производительности кода на этапе разработки, а не как часть производственных приложений.
Примечание: Стоит отметить, что Секундомер
не является потокобезопасным.
Он отслеживает время в наносекундах, полагаясь на System.nanoTime()
, что люди делают вручную для определения времени выполнения своего кода.
Измерение времени выполнения кода с помощью секундомера
Секундомер
принадлежит к ядру util
пакета Spring:
org.springframework spring-core
Естественно, он также присутствует в spring-boot-starter-web
зависимости:
org.springframework.boot spring-boot-starter-web
API секундомера
сводится к созданию экземпляра и вызову start()
и stop()
– как будто синхронизирует код с реальным секундомером. При запуске времени вы также можете указать Строку
, которая будет использоваться в качестве имени или аннотации для связанной задачи. Это помогает дифференцировать их в результатах.
Задача – это просто период между вызовом start()
и stop ()
. Для каждой задачи, созданной при запуске секундомера
, ее имя и время выполнения сохраняются в экземпляре 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()
.
Вы также можете получить доступ к последней задаче секундомера
через 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());
Теперь это приводит к:
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
Task 1 1008
При работе с несколькими задачами действительно удобным методом является метод prettyPrint ()
, который печатает все записи в виде таблицы с простым форматированием:
// Naming this StopWatch instance 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);
Вывод
В этом уроке мы рассмотрели класс утилиты Секундомер
– ответ Spring на врожденное отсутствие инструментов измерения времени в Java.