Компонент Stopwatch

Компонент Stopwatch

Компонент Stopwatch предоставляет способ профилировать код.

Установка

1
$ composer require symfony/stopwatch

Также вы можете клонировать репозиторий https://github.com/symfony/stopwatch.

Note

Якщо ви встановлюєте цей компонент поза додатком Symfony, вам потрібно підключити файл vendor/autoload.phpу вашому коді для включення механізму автозавантаження класів, наданих Composer. Детальніше можна прочитати у цій статті.

Использование

Компонент Stopwatch предоставляет простой и слаженный способ измерять время выполнения определённых частей кода, чтобы вы постоянно не анализировали микровремя самостоятельно. Вместо этого, используйте простой класс Stopwatch:

1
2
3
4
5
6
7
use Symfony\Component\Stopwatch\Stopwatch;

$stopwatch = new Stopwatch();
// начинает событие, названное 'eventName'
$stopwatch->start('eventName');
// ... здесь будет какой-то код
$event = $stopwatch->stop('eventName');

Объект StopwatchEvent можно извлечь из методов start(),
stop(),
lap() и
getEvent(). Последний стоит использовать, когда вам нужно извлечь длительность события, пока оно ещё идёт.

Tip

По умолчанию, секундомер урезает любую меру времени в подмиллисекундах до 0, так что вы не можете измерять в микросекундах или наносекундах. Если вам нужна большая точность, передайте true конструктору класса Stopwatch, чтобы включить полную точность:

1
$stopwatch = new Stopwatch(true);

Stopwatch может быть сброшен в своё исходное состояние в любое заданное время с помощью метода reset(), который удаляет все данные, замерянные до этого времени.

Вы можете также предоставить имя категории события:

1
$stopwatch->start('eventName', 'categoryName');

Вы можете рассмотривать категории, как способ тегирования событий. Например, инструмент Профилировщик Symfony использует категории, чтобы красиво маркировать цветом разные события.

Периоды

Как вы знаете из настоящего мира, все секундомеры имеют две кнопки: одна для запуска и остановки секундомера, а вторая - для замера одного круга. Это именно то, что делает метод lap():

1
2
3
4
5
6
7
8
9
$stopwatch = new Stopwatch();
// начинает событие 'foo'
$stopwatch->start('foo');
// ... здесь будет какой-то код
$stopwatch->lap('foo');
// ... здесь будет какой-то код
$stopwatch->lap('foo');
// ... здесь будет какой-то код
$event = $stopwatch->stop('foo');

Информация о круге хранится в виде "периодов" в рамках события. Чтобы получить информацию о круге, вызовите:

1
$event->getPeriods();

В дополнение к периодам вы можете получить другую полезную информацию из объекта события. Например:

1
2
3
4
5
6
7
$event->getCategory();   // возвращает категорию, в которой было начато событие
$event->getOrigin();     // возвращает время начала события в милисекундах
$event->ensureStopped(); // останаливает все ещё не остановленные периоды
$event->getStartTime();  // возвращает время начала самого первого периода
$event->getEndTime();    // возвращает время конца самого последнего периода
$event->getDuration();   // возвращает длительность события, включая все периоды
$event->getMemory();     // возвращает максимальное использование памяти всех периодов

Разделы

Разделы - это способ логично разделить хронологию на группы. Вы можете увидеть, как Symfony использует разделы, чтобы красиво визуализировать жизненный цикл фреймворка в инструменте Профилировщик Symfony. Вот базовый пример использования разделов:

1
2
3
4
5
6
7
$stopwatch = new Stopwatch();

$stopwatch->openSection();
$stopwatch->start('parsing_config_file', 'filesystem_operations');
$stopwatch->stopSection('routing');

$events = $stopwatch->getSectionEvents('routing');

Вы можете повторно открыть закрытый раздел, вызывав метод openSection() и указав id раздела, который стоит открыть повторно:

1
2
3
$stopwatch->openSection('routing');
$stopwatch->start('building_config_tree');
$stopwatch->stopSection('routing');