Skip to content

Feature Stopwatch

github-actions[bot] edited this page Jul 14, 2026 · 1 revision

⏲️ Секундомер — Stopwatch

← Возможности · Главная · Сравнение

Замеры длительностей на монотонном таймере: круги, остановка, миллисекунды. Состояние — целые наносекунды, деление до секунд только на выдаче.

Принцип работы

use CloudCastle\Clock\Stopwatch;

$watch = Stopwatch::start();

importUsers();
$watch->lap('пользователи');          // длительность этапа, float-секунды

importOrders();
$watch->lap('заказы');

$total = $watch->stop();              // полная длительность; повторный stop() — тот же результат

$watch->elapsedMilliseconds();        // после stop() зафиксировано
$watch->laps();                       // [['label' => 'пользователи', 'seconds' => ...], ...]
$watch->isRunning();                  // false

Перевод системных часов на замеры не влияет — источник времени hrtime().

Плюсы

  • Монотонность: замер не «уедет» из-за NTP-коррекции посреди операции.
  • Целочисленное состояние — никакого накопления float-ошибки на длинных сессиях.
  • Круги с метками — профилирование этапов без внешних инструментов.

Минусы

  • Не персистентен: секундомер живёт в памяти процесса.

✅ Рекомендуется

  • Замеры этапов в консольных командах и джобах.
  • Локальное профилирование «на скорую руку», где symfony/stopwatch — лишняя зависимость.

❌ Антипаттерны

  • Замер времени через разницу SystemClock::microtime() — уязвим к переводу часов; для этого и существует Stopwatch.

Схема фичи

flowchart LR
    ST["Stopwatch::start()"] --> W[Секундомер: int-наносекунды]
    W -->|"lap(метка)"| L[список кругов]
    W -->|"stop()"| E[зафиксированная длительность]
    K[("hrtime — монотонный таймер")] --> W
Loading

Жизненный цикл замера

stateDiagram-v2
    [*] --> Идёт: start()
    Идёт --> Идёт: lap('этап') — круг в список
    Идёт --> Идёт: elapsedSeconds() растёт
    Идёт --> Остановлен: stop()
    Остановлен --> Остановлен: stop()/elapsed — тот же результат
Loading

Сравнение с аналогами

Возможность Clock symfony/clock lcobucci/clock beste/clock nesbot/carbon ergebnis/clock 🏆 Победитель
Секундомер в пакете часов 🔌 Clock
Круги с метками 🔌 Clock
Целочисленное ns-состояние Clock

🔌 — symfony предлагает отдельный пакет symfony/stopwatch; в самом symfony/clock секундомера нет.

Clone this wiki locally