Класс Stopwatch
Класс Stopwatch служит для профилирования
и измерения времени выполнения кода. Он позволяет
запускать таймеры, останавливать их, создавать
промежуточные отметки и группировать замеры
в именованные секции. Первым параметром методы
start и stop принимают имя
события, вторым - имя секции.
Синтаксис
<?php
use Symfony\Component\Stopwatch\Stopwatch;
$stopwatch = new Stopwatch();
$stopwatch->start(string $name, ?string $category = null);
$stopwatch->stop(string $name);
$stopwatch->lap(string $name);
$stopwatch->isStarted(string $name);
$stopwatch->getEvent(string $name);
$stopwatch->getSectionEvents(string $category);
$stopwatch->openSection();
$stopwatch->stopSection(string $id);
?>
Пример
Давайте создадим секундомер и измерим время выполнения участка кода:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Stopwatch\Stopwatch;
class ArticleController extends AbstractController
{
#[Route('/', name: 'article_index')]
public function index(): Response
{
$stopwatch = new Stopwatch();
$stopwatch->start('article');
$res = [];
for ($i = 0; $i < 5; $i++) {
$res[] = $i;
}
$event = $stopwatch->stop('article');
return new Response(
(string) $event->getDuration()
);
}
}
?>
Результат выполнения кода:
0
Пример
Давайте создадим секцию и разместим в ней несколько замеров:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Stopwatch\Stopwatch;
class ArticleController extends AbstractController
{
#[Route('/', name: 'article_index')]
public function index(): Response
{
$stopwatch = new Stopwatch();
$stopwatch->openSection();
$stopwatch->start('first');
$stopwatch->stop('first');
$stopwatch->start('second');
$stopwatch->stop('second');
$stopwatch->stopSection('article');
$events = $stopwatch->getSectionEvents('article');
return new Response(
implode(',', array_keys($events))
);
}
}
?>
Результат выполнения кода:
"__section__,first,second"
Пример
Давайте используем метод lap для
промежуточной отметки внутри одного замера:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Stopwatch\Stopwatch;
class ArticleController extends AbstractController
{
#[Route('/', name: 'article_index')]
public function index(): Response
{
$stopwatch = new Stopwatch();
$stopwatch->start('article');
$stopwatch->lap('article');
$event = $stopwatch->stop('article');
$periods = $event->getPeriods();
return new Response(
(string) count($periods)
);
}
}
?>
Результат выполнения кода:
1
Пример
Давайте проверим, запущен ли замер,
с помощью метода isStarted:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Stopwatch\Stopwatch;
class ArticleController extends AbstractController
{
#[Route('/', name: 'article_index')]
public function index(): Response
{
$stopwatch = new Stopwatch();
$stopwatch->start('article');
$res = $stopwatch->isStarted('article');
$stopwatch->stop('article');
return new Response(
$res ? 'true' : 'false'
);
}
}
?>
Результат выполнения кода:
"true"