Рубрики
Без рубрики

Измерение времени выполнения Java – кода с помощью секундомера Spring

В этом уроке мы рассмотрим, как измерить время выполнения кода Java для проектов на базе Spring с помощью секундомера и его простого API.

Автор оригинала: 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.