Перейти к содержимому

Честное измерение производительности

Spec: ISO/IEC 25010 Spec: ISO/IEC 17025 Evidence: Benchmark-backed

Результат измерения без описания метода почти ничего не говорит. Фраза “NextPDF отрисовывает документ за N миллисекунд” ничего не значит, пока неизвестны документ, оборудование, число прогонов и разброс. На этой странице объясняется, как NextPDF измеряет производительность, почему сообщает о ней как о проверяемом сигнале, а не как о громком числе, и почему не публикует голый показатель скорости.

Заявления о производительности легко опубликовать и легко исказить, чаще всего случайно. Один прогретый прогон на простаивающем ноутбуке, самый быстрый результат из десяти попыток или микротест функции, которую никто не вызывает на горячем пути, — всё это может дать реальное число, которое ничего не предсказывает о вашей нагрузке. Spec: ISO/IEC 25010 определяет эффективность производительности как выполнение функций в пределах параметров времени и пропускной способности в заданных условиях (ISO/IEC 25010, §3.10). Уберите “в заданных условиях” — и число перестаёт быть измерением. Оно становится числом без смысла.

Есть и более незаметный сбой: число, которое когда-то было верным. Как только вы вставляете результат измерения в текст, он застывает. Тем временем код, среда выполнения и оборудование продолжают меняться. Устаревшее заявление “быстро” не просто бесполезно. Оно ошибочно, причём незаметно.

  • Показатель производительности не имеет смысла без описания метода: входных данных, среды, числа прогонов, правил прогрева и разброса.
  • NextPDF измеряет с помощью повторных прогонов, отбрасывает итерации прогрева и сообщает распределение, а не одно лучшее значение.
  • Обнаружение регрессий — статистическое: результат сравнивается с базовой линией с помощью t-критерия Уэлча, поэтому изменение должно быть одновременно статистически значимым и достаточно большим, чтобы иметь значение, прежде чем его засчитают как регрессию.
  • Нестабильная среда обнаруживается и фиксируется, а не незаметно усредняется: высокий разброс между прогонами делает результат недействительным, а не скрывается в среднем значении.
  • Производительность публикуется как живой сигнал, генерируемый вместе со сборкой, а не как застывшее громкое число — именно поэтому на этой странице нет ни одного значения в миллисекундах.

Шлюз производительности движка — это статистический тест, а не один прогон с замером времени. Задокументированная методика многократно запускает измеряемый набор, отбрасывает заданное число прогонов прогрева и вычисляет среднее, стандартное отклонение и коэффициент вариации как для длительности, так и для памяти. Затем она сравнивает текущий результат с зафиксированной базовой линией:

  1. Repeat Run the measured suite N times under fixed conditions.
  2. Discard warmup Drop the first W runs so cold-start noise is excluded.
  3. Summarise Compute mean, standard deviation, and coefficient of variation for duration and memory.
  4. Test vs baseline Welch's t-test (two-sample, unequal variance) against the committed baseline.
  5. Decide Significant AND effect over threshold → regression. Variance over threshold → unreliable, not a pass. Absolute ceiling breach → hard fail.
Как шлюз измерения производительности NextPDF выносит вердикт «пройдено», «провалено» или «ненадёжно»: выполнить повторные измерения, отбросить прогревы, обобщить распределение, затем применить t-критерий Уэлча к зафиксированной базовой линии. Регрессия требует статистической значимости И существенного размера эффекта; чрезмерный разброс фиксируется как ненадёжный, а не усредняется в вердикт.

Честность обеспечивают три свойства. Во-первых, регрессии нужны две вещи одновременно: статистическая значимость (разница вряд ли является шумом) и размер эффекта выше порога (разница достаточно велика, чтобы о ней беспокоиться). Крошечное реальное замедление не вызывает ложной тревоги. Крупное замедление в шумных данных не остаётся без внимания. Во-вторых, нестабильность — это вердикт: когда разброс между прогонами превышает границу, шлюз сообщает, что среда ненадёжна. Он не усредняет шум до бессмысленного среднего значения и не называет это прохождением. В-третьих, по-прежнему существует абсолютный потолок — жёсткая верхняя граница, которая проваливает сборку независимо от статистики. Благодаря ему “значимой регрессии нет” никогда не может оправдать уже слишком медленный результат.

Это та дисциплина измерений, которую ISO/IEC 17025 описывает для любой метрики, заслуживающей доверия: результаты, полученные в заранее заданных условиях, — повторяемость в пределах одной среды (ISO/IEC 17025, §3.7) и воспроизводимость между средами (ISO/IEC 17025, §3.5). Показатель производительности NextPDF имеет смысл только как “этот метод, эта базовая линия, этот прогон”. Именно поэтому он живёт вместе со сборкой, которая его породила, а не в предложении на этой странице.

Evidence: Benchmark-backed Шлюз измерения производительности движка выполняет повторные измерения с отбрасыванием прогрева, рассчитывает среднее, стандартное отклонение и коэффициент вариации, а также применяет двухвыборочный t-критерий Уэлча для сравнения с зафиксированной базовой линией. Явные исходы: “пройдено”, “регрессия”, “нестабильно” и “жёсткий потолок”. Тесты производительности также существуют в виде выделенного, отдельно запускаемого набора и стенда PHPBench. Производительность измеряется осознанно, а не оценивается на глаз.

Evidence: Standard-backed “В заданных условиях” — это не редакторская осторожность. Это определение. Spec: ISO/IEC 25010, §3.10 связывает эффективность производительности с заданными условиями времени, пропускной способности и ресурсов. Число без своих условий — это не более слабое измерение. Это вообще не измерение.

Evidence: Standard-backed Формулировка о повторяемости и воспроизводимости следует Spec: ISO/IEC 17025 : результат заслуживает доверия только относительно заранее заданных условий, отличая повторяемость в одной среде от воспроизводимости между средами. Тест производительности, который не может указать свои условия, не может претендовать ни на то, ни на другое.

На практике “честно” выглядит как описание метода, а не как число:

<?php
declare(strict_types=1);
// The gate is invoked with its conditions made explicit, e.g.:
//
// php ci/scripts/benchmark-gate.php \
// --runs=5 --warmup=1 --testsuite=Unit \
// --baseline=<committed-baseline>
//
// It then reports, for duration AND memory:
// - mean, standard deviation, coefficient of variation (the spread)
// - Welch's t-test p-value and effect size vs the baseline
// - a verdict: PASS | REGRESSION | UNSTABLE | hard-ceiling FAIL
//
// An honest performance statement is therefore shaped like:
// "<suite>, <runs> runs (<warmup> warmup), <hardware/runtime>,
// no statistically significant regression vs baseline <id>;
// coefficient of variation within bound."
//
// It is NEVER shaped like:
// "NextPDF is fast" — or a bare millisecond number with no method.

Результат теста производительности — это воспроизводимый метод и вердикт. Само значение в миллисекундах принадлежит сборке, которая его породила и где вы можете получить его заново, а не документации, куда его переписали и где вы этого сделать не можете.

Первое заблуждение в том, что тест производительности — это число. Тест производительности — это процедура, которая даёт распределение. Число — лишь одна выборка из этого распределения. Сообщить лучший из нескольких прогонов или один прогретый прогон — это не оптимизм. Это измерение совсем другого результата (пика в идеальных условиях), выданного за типичную производительность.

Второе в том, что “нет статистически значимой регрессии” означает “гарантированно так же быстро, как раньше”. На самом деле это означает, что наблюдаемая разница находится в пределах того, что метод способен отличить от шума при данном числе прогонов и данном разбросе. Это ограниченное, условное утверждение. Именно поэтому NextPDF сохраняет абсолютный потолок как независимую защиту и отказывается сводить результат к безусловному заявлению — ни в свою пользу, ни против кого-либо ещё.

Эта страница описывает, как NextPDF измеряет производительность и сообщает о ней. Она намеренно не приводит ни показателей пропускной способности, ни задержки, ни памяти. Это живые сигналы, генерируемые из артефактов непрерывной интеграции в заявленных условиях, а текущие значения публикуются вместе со сборкой. Число, повторённое здесь, было бы лишено условий и устарело бы — именно против такого сбоя выступает эта страница. Нет стабильной константы производительности, которую можно было бы привести, поэтому ничего не приводится. Результат — сама дисциплина.

Число прогонов, правила прогрева, пороги и базовая линия принадлежат конфигурации тестирования производительности движка и развиваются вместе с движком и его оборудованием. Если эта конфигурация когда-либо разойдётся с этим объяснением, авторитетным источником будет она. NextPDF не сравнивает производительность ни с какой другой библиотекой — ни в свою пользу, ни во вред кому-либо, — поскольку такое сравнение без идентичных, заявленных условий было бы именно тем безусловным заявлением, отказу от которого посвящена эта страница.

  • Тест производительности — определённая процедура, которая даёт распределение измерений в заявленных условиях, а не одно число.
  • Прогон прогрева — начальная итерация, которая отбрасывается, чтобы эффекты холодного старта (JIT, кэши, автозагрузка) не искажали измеряемый результат.
  • Коэффициент вариации — стандартное отклонение, делённое на среднее; безразмерная мера разброса, используемая для оценки того, достаточно ли стабилен прогон, чтобы ему доверять.
  • t-критерий Уэлча — двухвыборочный статистический тест для неравных дисперсий; здесь он используется, чтобы решить, отличается ли результат от базовой линии сильнее, чем можно объяснить шумом.
  • Размер эффекта — насколько велика разница, независимо от статистической значимости; NextPDF требует и того, и другого, прежде чем объявить регрессию.
  • Повторяемость / воспроизводимость — согласованность результатов в заранее заданных условиях в пределах одной среды (повторяемость) или между средами (воспроизводимость), согласно ISO/IEC 17025.
  • Абсолютный потолок — жёсткая верхняя граница, которая проваливает сборку независимо от статистического сравнения.