콘텐츠로 이동

정직한 벤치마킹

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

방법론 없는 벤치마크 수치는 거의 아무것도 알려 주지 않습니다. “NextPDF는 문서를 N 밀리초에 렌더링한다”라는 말은 문서, 하드웨어, 실행 횟수, 분산을 모르면 아무것도 알려 주지 않습니다. 이 페이지에서는 NextPDF가 성능을 측정하는 방식, 헤드라인 수치 대신 게이트를 거친 신호를 보고하는 이유, 그리고 속도 수치를 싣지 않는 이유를 설명합니다.

성능 주장은 게시하기 가장 쉽고 조작하기도 가장 쉬운 수치입니다. 대개 의도치 않게 그렇게 됩니다. 유휴 상태의 노트북에서 한 번 워밍업한 실행, 열 번 시도 중 가장 빠른 실행, 핫 경로에서는 아무도 호출하지 않는 함수의 마이크로벤치마크: 이들은 모두 실제 수치를 만들어 내지만, 여러분의 워크로드에 대해서는 아무것도 예측하지 못합니다. Spec: ISO/IEC 25010 은(는) 성능 효율성을 지정된 조건에서 시간 및 처리량 매개변수 이내로 기능을 수행하는 것으로 정의합니다(ISO/IEC 25010, §3.10). “지정된 조건에서”를 제거하면 그 수치는 더 이상 측정값이 아닙니다. 그저 의미 없는 숫자가 됩니다.

더 조용한 실패도 있습니다. 한때는 맞았던 수치입니다. 벤치마크 결과를 문서 본문에 붙여 넣는 순간 그 수치는 고정됩니다. 그동안 코드, 런타임, 하드웨어는 계속 변합니다. 오래된 “빠르다”라는 주장은 도움이 되지 않을 뿐만 아니라 틀린 말입니다. 더 문제는 조용히 틀렸다는 점입니다.

  • 성능 수치는 방법론 없이는 무의미합니다: 입력, 환경, 실행 횟수, 워밍업 정책, 그리고 분포 폭이 포함됩니다.
  • NextPDF는 반복 실행으로 측정하고, 워밍업 반복을 폐기하며, 단일 최상의 수치가 아니라 분포를 보고합니다.
  • 회귀 탐지는 통계적입니다: 결과는 Welch 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 의 벤치마크 게이트가 통과, 실패, 또는 신뢰 불가를 결정하는 방식: 반복 측정을 수행하고, 워밍업을 버리고, 분포를 요약한 다음, 커밋된 기준선에 대해 Welch t-검정을 적용합니다. 회귀로 판정되려면 통계적 유의성 AND 유의미한 효과 크기가 모두 필요하며, 과도한 분산은 판정에 평균으로 반영되는 대신 신뢰 불가로 보고됩니다.

세 가지 특성이 이 방식을 정직하게 만듭니다. 첫째, 회귀에는 두 가지가 동시에 필요합니다: 통계적 유의성(그 차이가 노이즈일 가능성이 낮음) 그리고 임계값을 넘는 효과 크기(그 차이가 신경 쓸 만큼 충분히 큼)입니다. 작지만 실제로 존재하는 둔화는 거짓 경보를 일으키지 않습니다. 노이즈가 큰 데이터에서 큰 둔화가 나타나도 그냥 지나치지 않습니다. 둘째, 불안정성 자체가 하나의 판정입니다: 실행 간 변동이 한계를 초과하면 게이트는 환경을 신뢰할 수 없다고 보고합니다. 의미 없는 평균을 내고 이를 통과라고 부르지 않습니다. 셋째, 여전히 절대 상한선이 존재합니다 — 통계와 무관하게 빌드를 실패시키는 강한 상한선입니다. 이 때문에 “유의미한 회귀 없음”이 이미 너무 느린 결과를 결코 정당화할 수 없습니다.

이는 신뢰할 수 있는 지표라면 필요한, ISO/IEC 17025가 기술하는 측정 규율입니다: 사전에 정해진 조건에서 얻은 결과 — 단일 환경 내에서의 반복성(ISO/IEC 17025, §3.7)과 여러 환경에 걸친 재현성(ISO/IEC 17025, §3.5)입니다. NextPDF의 성능 수치는 오직 “이 방법, 이 기준선, 이 실행”으로서만 의미가 있습니다. 바로 그 때문에 그 수치는 여기 한 문장에 있는 것이 아니라 그 수치를 만들어 낸 빌드와 함께 존재합니다.

Evidence: Benchmark-backed 엔진의 벤치마크 게이트는 워밍업 폐기를 포함한 반복 측정, 평균 / 표준 편차 / 변동 계수 요약, 그리고 커밋된 기준선에 대한 2-표본 Welch 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는 다른 어떤 라이브러리와도 성능을 비교하지 않습니다 — 유리하든 불리하든 — 동일하고 명시된 조건 없는 비교는 이 페이지가 거부하려는 바로 그 한정되지 않은 주장이 되기 때문입니다.

  • 골든 파일 테스트 — 비트 단위 / 구조적 / 의미적 프로파일을 포함해 출력 정확성에도 동일한 재현성 규율을 적용합니다.
  • NextPDF 테스트 피라미드 — 성능 계층의 위치와, 그것이 모든 변경에 대해서가 아니라 옵트인인 이유를 설명합니다.
  • 변이 테스트 설명 — NextPDF가 허영 지표가 아니라 게이트를 거친 신호를 보고하는 또 다른 곳입니다.
  • 벤치마크 — 단일 수치가 아니라 명시된 조건에서 측정값의 분포를 산출하는 정의된 절차입니다.
  • 워밍업 실행 — 콜드 스타트 효과(JIT, 캐시, 오토로드)가 측정 결과를 오염시키지 않도록 폐기되는 초기 반복입니다.
  • 변동 계수 — 표준 편차를 평균으로 나눈 값으로, 실행이 신뢰할 만큼 안정적인지 판단하는 데 사용되는 단위가 없는 분포 폭 척도입니다.
  • Welch t-검정 — 분산이 같지 않은 두 표본에 대한 통계 검정으로, 여기서는 결과가 노이즈를 넘어 기준선과 다른지를 판정하는 데 사용됩니다.
  • 효과 크기 — 통계적 유의성과는 별개로 차이가 얼마나 큰지를 나타내며, NextPDF는 회귀를 선언하기 전에 두 가지를 모두 요구합니다.
  • 반복성 / 재현성 — ISO/IEC 17025에 따라, 사전에 정해진 조건에서 단일 환경 내(반복성) 또는 여러 환경에 걸쳐(재현성) 결과가 일치하는 정도입니다.
  • 절대 상한선 — 통계적 비교와 무관하게 빌드를 실패시키는 강한 상한선입니다.