Компонент Stopwatch

Дата оновлення перекладу 2023-06-07

Компонент 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');