# KaTeX Worker 性能(重定向) 该页面已迁移到中文指南目录: - 新页面:`/zh/guide/katex-worker-performance-analysis` 如果你的链接仍指向 `/zh/katex-worker-performance-analysis`,页面将自动跳转。 # KaTeX Worker 性能分析指南(中文) ## 问题:Worker 是否比直接渲染更合适? 本文档帮助你判断在何种场景下使用 Web Worker 会带来性能优势。 ## 快速结论 **是的,Worker + Cache 架构在大多数真实场景中有显著优势。** 关键原因: 1. Cache 能消除大部分重复渲染开销(缓存命中率通常 >70%) 2. Worker 能阻止主线程被阻塞,从而保证 UI 响应 3. 内存占用极小(举例:200 个公式大约 10–50KB) ## 简要对比(场景) - 场景:单个简单公式 - 直接渲染:约 2–5ms - Worker:约 3–7ms(含通信开销) - 结论:Worker 略慢,但差异可以忽略 - 场景:单个复杂公式 - 直接渲染:约 20–50ms(阻塞主线程) - Worker:约 22–52ms(不阻塞) - 结论:Worker 明显改善用户体验 - 场景:重复公式多(带缓存) - 直接渲染:5ms × 10 次 = 50ms - Worker + Cache:5ms + 0.01ms × 9 次 ≈ 5.09ms - 结论:Worker 快约 10 倍 - 真实文档(混合场景) - 50 个公式,其中 35 个重复 - 无缓存:250ms(全部渲染) - 有缓存:75ms(仅渲染 15 个) - 缓存命中率:70% - 性能提升:3.3× ## 如何运行基准测试 1. 安装依赖 ```bash pnpm install ``` 2. 运行 KaTeX Worker 对比测试 ```bash pnpm test test/benchmark/katex-worker-vs-direct.test.ts ``` 3. 查看更详细报告 ```bash pnpm test test/benchmark/katex-worker-vs-direct.test.ts -- --reporter=verbose ``` ## 如何判断是否应该启用 Worker 当一次渲染的“唯一公式数”大于阈值 N 时,使用 Worker 更安全。经验公式: N ≈ floor(B / (R × (1 - H))) - B:主线程预算(ms),常用 50ms(卡顿阈值)或 16.7ms(单帧预算) - R:单个“唯一公式”的平均渲染耗时(ms) - H:缓存命中率(0..1) 仓库中提供了一个测量脚本: ```bash node scripts/measure-katex-threshold.mjs ``` 此外,`markstream-vue` 提供了辅助函数可推荐阈值: ```ts import { recommendNForSamples, recommendWorkerThreshold } from 'markstream-vue/utils/katex-threshold' ``` ## 浏览器中实时监控性能 可以在应用中启用性能监控: ```ts import { enablePerfMonitoring, getPerfReport } from 'markstream-vue/utils/performance-monitor' enablePerfMonitoring() setTimeout(() => { console.log(getPerfReport()) }, 30000) ``` 或者在浏览器控制台运行: ```js window.__katexPerfReport() window.__katexPerfMonitor.exportMetrics() ``` ## 使用 Chrome DevTools 分析 - Performance:录制渲染流程;查看主线程与 Worker 的时间 - Memory:检查 cache 的内存占用 - Performance Monitor:观察 CPU、JS heap、帧率等 ## 决策表 推荐使用 Worker 的场景: - 复杂公式 - 每页多个公式 - 大量重复公式(命中缓存) - 需要流畅交互(滚动、动画) - 移动端(CPU 弱) 适合直接渲染的场景: - 仅简单公式(<5ms) - SSR 或没有 Worker API 的环境 - 对包体积有严格限制 ## 最佳实践 - 使用 Worker + Cache 作为默认策略,并保留主线程 fallback - 对常见公式做预渲染或预热缓存 - 使用 requestIdleCallback 做非关键渲染 - 根据实际测量调整 `CACHE_MAX` 大小 ## 测量示例与结论 - Worker+Cache 在多数混合文档场景下能将渲染时间减少到原来的约 1/3 - 内存开销很小,通常无需担心 - Worker 防止主线程阻塞,提高用户体验 ## 参考 - Chrome Performance 文档:https://developer.chrome.com/docs/devtools/performance/ - Web Worker 性能说明:https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers#performance_considerations - KaTeX 性能提示:https://katex.org/docs/performance.html