Skip to content

ci(benchmark): recalibrate the baseline after the Next 16.4 update - #797

Merged
owjs3901 merged 1 commit into
mainfrom
ci/benchmark-recalibrate-next-16-4
Oct 21, 2026
Merged

owjs3901 merged 1 commit into
mainfrom
ci/benchmark-recalibrate-next-16-4

Conversation

@owjs3901

Copy link
Copy Markdown
Contributor

#768의 Next/SWC 16.3.6 → 16.4.2, React/react-dom 19.3.0 → 19.3.1 업데이트로 상대 시간 기준선이 달라졌습니다. Devup의 절대 빌드 시간이 느려진 회귀가 아닙니다. 사용자 방침에 따라 구현 변경과 분리하여 기준선만 재보정합니다.

변경

  • benchmark-baseline.json 하나만 변경합니다. 9개 gated 행의 ratio, 독립 VM 10개의 calibration, 공식으로 계산한 timeTolerance, 새 출력/CSS 크기를 반영합니다. 예전 익명 calibration 값은 섞지 않습니다.
  • benchmark-manifest.json과 baseline의 samples는 모두 3입니다. workflow, gate 공식, 최소 허용치, README 공개 표는 바꾸지 않습니다.
  • changepack은 없습니다. 이 파일은 배포 패키지의 관리 대상 경로가 아닙니다.

원인: 동일 VM의 A/B/C 비교

A/B run 39390117341: 12개 회전 블록 × 3개 variant × 3행 × 7 cold builds = 756회입니다. 독립 VM 756개가 아니라 하나의 VM입니다.

행 A 초 / control ratio B 초 / ratio C 초 / ratio
tailwind-turbo 6.971747 / 1.000000 5.640894 / 1.000000 5.574219 / 1.000000
devup-ui-turbo 7.043858 / 1.004296 5.979664 / 1.067132 5.965961 / 1.071816
devup-ui-single-turbo 7.008825 / 1.001063 5.972667 / 1.060780 5.991610 / 1.074387

블록별 paired 효과와 조건부 95% bootstrap 구간(50,000회, seed 7682026):

행 B/A ratio 변화 C/A ratio 변화 B/C ratio 변화 B/A 절대 시간 변화 C/A 절대 시간 변화
tailwind-turbo 0% 0% 0% -19.91% [-20.90,-18.50] -20.50% [-21.92,-18.84]
devup-ui-turbo +6.01% [5.38,6.97] +6.76% [6.14,7.65] -0.55% [-1.24,-0.23] -14.69% [-16.06,-13.47] -14.93% [-15.97,-12.66]
devup-ui-single-turbo +6.03% [4.85,7.43] +6.92% [6.37,8.30] -1.19% [-1.62,-0.26] -15.37% [-16.47,-12.85] -14.75% [-15.75,-12.84]

Tailwind control은 약 20%, Devup은 약 15% 빨라져 ratio만 상승합니다. Devup/Oxc 변경 없이 C에서 상승이 재현됩니다. Next, SWC, React 각각의 기여를 따로 분리한 실험은 아닙니다.

StyleX 이상치와 샘플 수 결정

수집 run 39403055275은 24 VM × 18행 × 7회 = 3,024회입니다. 일치 cohort는 14 VM이었습니다. 첫 10개 보정 / 나머지 4개 검증에서 3회·7회 모두 0/4 실패였지만, 이 유한 cohort의 모든 10/4 분할 교차 검증은 두 정책 모두 job 실패율 **7.14%**였습니다. 재사용된 4,004 예측은 독립 VM 4,004개가 아닙니다. 7회는 실패율 개선 없이 job 중앙 시간이 3회 추정 14.96분에서 7회 실측 29.99분으로 늘어, 3회 정책을 유지했습니다. 이전 3회 추정은 7회 순서의 앞부분(offset 0,2,5)이므로 아래의 실제 3회 순서(offset 0,6,12)로 다시 검증했습니다.

이전 VM 4(EPYC 9V45, image 20261012.334.1)는 18행 모두 절대 시간이 더 빨랐습니다. 같은 환경의 나머지 13 VM과 비교하면 StyleX+Devup 5.089434초 대 6.838033초(-25.57%), control 2.748376초 대 4.653252초(-40.94%)입니다. StyleX/control ratio는 1.851797 대 1.467871(+26.16%)입니다. 전체 VM의 느려짐이 아니라 빠른 호스트에서 이 행이 control보다 덜 빨라지는 상대 이상치입니다. CPU 이름만으로 원인을 확정하지 않으며, 느리다는 이유로 VM을 빼지 않았습니다.

이전 첫 3회 후보의 StyleX tolerance는 **73.41%**였습니다. 허용치가 약 70%라면 기준선 부근의 StyleX 행에서 그보다 작은 실제 회귀를 잡지 못합니다. 통과를 위해 그 값을 채택하거나 수동으로 허용치를 늘리지 않았습니다. 아래 native 재보정에서는 **23.64%**가 계산되었습니다. 이 값 역시 더 작은 회귀를 놓칠 수 있습니다.

실제 CI 절차 검증

검증 run 39418552771, 임시 harness 26d0ee9de10b5a6ff8181a1817f07bdf4f6ef49b. 보정과 독립 검증은 모두 7188d5ffc2243048dd55f2b6cd845f4738959bfc에서 실행했습니다. PR 브랜치는 새 clone 시점의 최신 main **770aaac5977f1eae9771516b60868daed842e63c**에서 생성했으며, 완료된 baseline 파일만 복사했습니다. 최신 main에서 재측정했다고 주장하지 않습니다.

  • 28개 독립 VM × 18행 × 3 cold builds = 1,512회. 각 VM에서 수정하지 않은 **bun benchmark.js**를 실행하고 그 JSON을 그대로 gate에 넣었습니다. 로컬 benchmark는 실행하지 않았습니다.
  • 타이밍을 보기 전에 고정한 규칙: source/lock/image/tool이 정확히 같은 가장 큰 cohort를 선택하고, VM index가 낮은 첫 10개로 보정한 뒤 나머지 전부로 검증합니다.
  • 선택 cohort: image 20261012.334.1, 18 VM. 보정 0,1,2,4,5,6,7,8,10,12; 독립 holdout 15,16,18,20,22,23,24,27 8개.
  • Bun 1.4.3, Node v26.12.0, Rust 1.99.1 (58cf8f9c3 2026-10-13), wasm-pack 0.15.0. source와 Bun/Cargo lock hash를 일치시켰습니다.
  • 다른 image 20261018.339.1의 10 VM은 보정에 섞지 않았습니다. 별도 stress check에서 0/10 실패였습니다.
  • 9행 각각 0/8, 전체 job 0/8 (0.00%) false failure. 전체 job은 원래 gate에서 하나라도 실패하는지로 계산합니다. 95% Wilson 구간은 **[0.00%,32.44%]**로 넓습니다. 표본 8개만으로 실제 실패 확률이 0에 가깝다고 보증하지 않습니다.
행 이전 ratio → 새 ratio 이전 tolerance → 새 tolerance holdout 실패
stylex-turbo-devup-ui 1.350900 → 1.459588 22.03% → 23.64% 0/8
devup-ui 0.856000 → 0.889199 14.13% → 25.83% 0/8
devup-ui-single 0.870400 → 0.885712 12.50% → 10.00% 0/8
devup-ui-single-turbo 0.979400 → 1.081274 10.39% → 10.00% 0/8
devup-ui-turbo 0.990100 → 1.090312 10.00% → 11.33% 0/8
vanilla-extract-devup-ui 0.988200 → 1.080276 20.46% → 10.79% 0/8
tailwind-turbo-devup-ui 0.998600 → 1.081890 14.63% → 10.53% 0/8
vinext-devup-ui 0.196200 → 0.197065 24.06% → 21.92% 0/8
devup-ui-collapse 1.011800 → 1.054242 17.10% → 13.59% 0/8
행 이전 bytes → 새 bytes 이전 CSS bytes → 새 CSS bytes
stylex-turbo-devup-ui 31230251 → 25298951 321 → 321
devup-ui 71047404 → 71570289 494 → 494
devup-ui-single 71033778 → 71557238 395 → 395
devup-ui-single-turbo 36538765 → 29916073 327 → 327
devup-ui-turbo 36541732 → 29924655 358 → 358
vanilla-extract-devup-ui 36580207 → 29969233 268 → 268
tailwind-turbo-devup-ui 36593833 → 29949349 1491 → 1011
vinext-devup-ui 1248050 → 1248050 14873 → 14873
devup-ui-collapse 31849350 → 25868341 1286 → 1286

ratio는 VM별 target/control 중앙값 비율 10개의 중앙값입니다. timeTolerance=max(0.10,2*(max(calibration)-min(calibration))/median(calibration))를 그대로 사용합니다. 출력/CSS는 새 VM 10개의 각 중앙값을 다시 중앙값·반올림한 값입니다. 네이티브 JSON 입력 지원만 추가한 기존 offline writer를 사용했으며, 기존 정책 테스트와 malformed native 입력 6가지 거절 테스트를 통과했습니다.

실패 공식도 그대로입니다: ratio > baseline.ratio*(1+timeTolerance), bytes > floor(baseline.bytes*1.01), cssBytes > baseline.cssBytes+max(floor(baseline.cssBytes*0.05),32). 별도 개선안은 StyleX의 control 적합성 또는 사전에 선언한 호스트 계층화를 독립 PR에서 검토하는 것입니다. 이 PR에서는 공식이나 tolerance 정책을 바꾸지 않습니다.

로컬 검증

  • 짧은 새 clone 경로 C:\Users\devfive3901\AppData\Local\Temp\opencode\rc에서 bun install --frozen-lockfile을 기본 isolated linker로 실행했습니다. lockfile 변경 없이 install 및 WASM-first bun run build가 통과했습니다.
  • Node v26.12.0 경로는 기존 PATH 앞에 추가했고 Bun 1.4.3, CARGO_BUILD_JOBS=2, CI/RUST_MIN_STACK unset, 기본 Rust stack을 사용했습니다.
  • 이번 승인에서 정상 commit/pre-commit hook은 한 번만 실행했습니다. 시작 시 여유 물리 메모리는 9,009,852,416 bytes였고 전체 hook 프로세스 트리에 12 GiB (12,884,901,888 bytes) Windows job-object cap을 적용했습니다. bun lint와 bun run test(Rust tarpaulin 포함)가 모두 통과했습니다. Bun 결과는 6649 pass / 0 fail, 89 snapshots, 25034 assertions입니다. 이전 환경의 Next webpack 3건과 plugin-utils reservation 1건도 이번 전체 실행에서는 실패하지 않았습니다.
  • 이전 긴 경로 clone의 hoisted linker / 6 GiB cap 실행 실패와 이번 표준 환경 결과를 구분합니다. hook 생략, amend, 구현·테스트·workflow 수정, 로컬 benchmark 실행은 하지 않았습니다. Biome LSP는 미설치 및 이전 설치 거절 상태라 사용하지 못했으며 JSON lint는 정상 hook에서 통과했습니다.

Refs #683

@codecov

codecov Bot commented Oct 20, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@owjs3901
owjs3901 merged commit b5cfdb1 into main Oct 21, 2026
11 checks passed
@owjs3901
owjs3901 deleted the ci/benchmark-recalibrate-next-16-4 branch October 21, 2026 07:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant