Lighthouse 性能分数波动大时怎么控制变量并设置稳定阈值 Lighthouse 性能分数波动大时怎么控制变量并设置稳定阈值【免费下载链接】lighthouseAutomated auditing, performance metrics, and best practices for the web.项目地址: https://gitcode.com/GitHub_Trending/lig/lighthouseLighthouse 的性能分数会在没有任何代码变更的情况下每次运行都不同——这是 Web 与网络技术固有的波动性不是 bug。如果你用 CI 或本地单次运行的分数来判断一次改动是否影响性能结论往往不可靠。这篇文章基于项目官方文档 variability 与 throttling完成一个完整任务先固定测试环境、硬件与节流配置再多次运行 Lighthouse 取中位数最后在聚合值而不是单次分数上设置性能阈值。适用于通过 CLI 或 lighthouse-ci 运行 Lighthouse 的场景lighthouse-ci 命令要求已安装 Node。波动来源先确认哪些因素在影响你的结果variability 文档 列出了七类常见的指标波动来源它们在不同环境中出现的概率不同来源影响典型终端用户PageSpeed Insights受控实验室Page nondeterminismHighLIKELYLIKELYLIKELYLocal network variabilityHighLIKELYUNLIKELYUNLIKELYTier-1 network variabilityMediumPOSSIBLEPOSSIBLEPOSSIBLEWeb server variabilityLowLIKELYLIKELYLIKELYClient hardware variabilityHighLIKELYUNLIKELYUNLIKELYClient resource contentionHighLIKELYPOSSIBLEUNLIKELYBrowser nondeterminismMediumCERTAINCERTAINCERTAIN不同的节流策略对各个来源的缓解程度也不一样来源影响Simulated ThrottlingDevTools ThrottlingNo ThrottlingPage nondeterminismHighNO MITIGATIONNO MITIGATIONNO MITIGATIONLocal network variabilityHighMITIGATEDPARTIALLY MITIGATEDNO MITIGATIONTier-1 network variabilityMediumMITIGATEDPARTIALLY MITIGATEDNO MITIGATIONWeb server variabilityLowNO MITIGATIONPARTIALLY MITIGATEDNO MITIGATIONClient hardware variabilityHighPARTIALLY MITIGATEDNO MITIGATIONNO MITIGATIONClient resource contentionHighPARTIALLY MITIGATEDNO MITIGATIONNO MITIGATIONBrowser nondeterminismMediumPARTIALLY MITIGATEDNO MITIGATIONNO MITIGATIONSimulated throttling 是 Lighthouse 的默认策略它基于首次未节流加载采集的数据重新模拟页面加载速度快且确定性强。而 packet-level 节流虽然最精确文档却明确指出它比 simulated 或 DevTools 节流引入的方差更大——所以追求分数稳定的目标是保留默认的 simulated throttling不要换成 packet-level 工具。需要特别注意Page nondeterminism 没有任何节流策略能缓解。改变布局与资源的 A/B 测试、随 campaign 进度变化的广告体验都会改变分数文档给出的唯一缓解手段是确保不同次运行之间测试的是完全相同版本的页面。固定测试环境硬件要求variability 文档 的 Run on Adequate Hardware 一节给出了硬性清单最少 2 个专用核推荐 4 个最少 2GB 内存推荐 4–8GB避免非标准 Chromium 参数--single-process不受支持--no-sandbox和--headless可用避免 function-as-a-service 基础设施Lambda、GCF 等避免 burstable 或 shared-core 实例AWSt系列、GCP shared-core N1 和 E2 等文档举例 AWSm5.large、GCPn2-standard-2、AzureD2都足以运行单实例 Lighthouse。如果机器不满足上述要求Lighthouse 仍然能跑、非性能类结果也仍然可用但性能结果不应用于阈值判断。文档中有两条红线不要在同一台机器上同时收集多份 Lighthouse 报告——并发运行会因资源争用扭曲性能结果横向扩展优于纵向扩展用 4 台n2-standard-2各跑一个 Lighthouse好过一台n2-standard-8。隔离外部因素尽可能把页面从第三方影响中隔离出来隔离你自己代码中的非确定性一个随机出现的动画会让性能数字同样随机测试服务器放在 localhost 或同一网络内的机器上减少网络波动使用专用设备测试隔离杀毒软件、浏览器扩展等外部影响。Running at Scale 文档还补充了一条复用同一个 Chrome 做多轮运行会让 profile 中积累状态每次 Lighthouse 运行使用全新的 profile才是可复现结果的最佳做法。固定节流与模拟配置网络节流Lighthouse 的 mobile 节流预设默认定义在 constants 中Latency: 150msThroughput: 1.6Mbps down / 750 Kbps upPacket loss: none该预设大致代表 4G 连接的最差 25% 与 3G 连接最好 25%Lighthouse 内部称为 Slow 4G。CLI 的--throttling-method有三个取值simulate默认、devtools、provided。不同运行之间保持该方法一致三种方式各自的缓解差异见上面的表格。CPU 节流Lighthouse 默认使用恒定 4 倍 CPU 乘数把典型的高端桌面机运行拉入 mid-tier mobile 区间。是否需要校准取决于宿主机的benchmarkIndex——每份报告都会保存这个值可以在报告底部的 CPU/Memory Power 处看到。文档给出的 Chrome m86 各档设备区间设备档位高端桌面低端桌面高端移动中端移动低端移动Lighthouse BenchmarkIndex1500–20001000–1500800–1200125–800125当 Lighthouse 从 CLI 以默认设置运行在性能不足的机器上时报告里会加一条警告建议校准 slowdown。校准用--throttling.cpuSlowdownMultiplier标志文档示例# Run Lighthouse with a custom CPU slowdown multiplier lighthouse --throttling.cpuSlowdownMultiplier6 https://example.comhttps://example.com是文档示例中的被测地址替换为你要测试的 URL。throttling 文档 还按 宿主机档位 × 目标档位 给出了乘数表例如高端桌面机目标 mid-tier mobile 用 4x范围 2–10、目标 low-end mobile 用 10x范围 5–20你的 benchmarkIndex 落在档位区间的高端就取范围内较高的乘数落在低端就取较低值。测试桌面站点时用--presetdesktop获得一致的桌面环境与评分校准emulation 文档 建议用它替代--emulated-form-factordesktop。多次运行并取中位数variability 文档 对阈值的要求很直接创建失败阈值无论是心里的还是程序化的时使用中位数、90 分位数或 min/max 这类聚合值而不是单次测试的结果。文档给出的量化结论是5 次运行的 Lighthouse 分数中位数比单次运行稳定一倍。最短路径是 lighthouse-ci。收集 5 次运行并输出到文件系统npx -p lhci/cli lhci collect --url https://example.com -n 5 npx -p lhci/cli lhci upload --target filesystem --outputDir ./path/to/dump/reports./path/to/dump/reports是报告输出目录的占位路径替换成你选择的任意目录即可。运行后输出目录会包含manifest.json每次运行一个条目其中isRepresentativeRun字段标记了被选中为 median run 的那份报告。文档给出的处理脚本const fs require(fs); const lhciManifest require(./path/to/dump/reports/manifest.json); const medianEntry lhciManifest.find(entry entry.isRepresentativeRun); const medianResult JSON.parse(fs.readFileSync(medianEntry.jsonPath, utf-8)); console.log(Median performance score was, medianResult.categories.performance.score * 100);脚本里的./path/to/dump/reports与上一步的--outputDir保持一致。categories.performance.score是 0–1 的数值乘 100 即报告上的百分制分数这段脚本的输出就是你的阈值基准。如果直接用 Node 调用 Lighthouse CLI项目自带 computeMedianRun它选取 FCP 与 TTI 最接近各自中位数的那次运行欧氏距离作为中位数运行——刻意不用分数本身的中位数因为单次分数在加载首尾仍可能有离群行为。文档示例const spawnSync require(child_process).spawnSync; const lighthouseCli require.resolve(lighthouse/cli); const {computeMedianRun} require(lighthouse/core/lib/median-run.js); const results []; for (let i 0; i 5; i) { console.log(Running Lighthouse attempt #${i 1}...); const {status -1, stdout} spawnSync(node, [ lighthouseCli, https://example.com, --outputjson ]); if (status ! 0) { console.log(Lighthouse failed, skipping run...); continue; } results.push(JSON.parse(stdout)); } const median computeMedianRun(results); console.log(Median performance score was, median.categories.performance.score * 100);注意computeMedianRun在任何一次运行缺失 FCP 或 TTI 时会直接抛错Some runs were missing an FCP value/Some runs were missing an TTI value所以示例脚本先跳过非零退出码的失败运行。可选分支lighthouse-ci 也可以让 PageSpeed Insights 托管实验室替你跑PSI API 默认配额为每天 25,000 次请求且 URL 必须可被 Web 访问不能测 localhostnpx -p lhci/cli lhci collect --url https://example.com -n 5 --mode psi --psiApiKey xXxXxXxxXxXxXx是 PSI API key 的占位符替换为你自己的 key。设置并验证稳定阈值串起来文档支持的稳定阈值路径是在固定的硬件、隔离环境和一致的节流配置下运行 Lighthouse 多次文档示例为 5 次通过manifest.json的isRepresentativeRun或computeMedianRun得到中位数、90 分位数或 min/max 聚合值;把阈值设在这些聚合值上而不是任何单次运行的分数上。验证方式是具体的检查输出目录中的manifest.json是否包含每次运行条目并正确标记代表运行运行上面的脚本确认能读出中位数分数。文档没有给出 稳定到什么数值才算合格 的固定判据唯一的量化陈述是 5 次中位数比单次运行稳定一倍。限制Page nondeterminismA/B 测试、随机广告等无法被任何节流策略缓解只能通过确保运行之间测试相同页面版本来控制simulated throttling 对替代执行路径的预测不完美存在文档明确说明的 edge case 不准确性深度性能调查文档建议使用 packet-level 工具但该类工具方差更大不适合本文的稳定化目标;PSI 路径不能测试 localhost 或被防火墙隔离的 URL托管实验室省去了维护硬件但要求 URL 可公网访问。完整的波动性分析见 variability 文档CPU 校准表与 packet-level 工具说明见 throttling 文档。【免费下载链接】lighthouseAutomated auditing, performance metrics, and best practices for the web.项目地址: https://gitcode.com/GitHub_Trending/lig/lighthouse创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考