为什么"优化"总是做错
绝大多数失败的优化都死于同一个原因:没有测量就动手。先看两种工作模式的差异,再理解为什么本书把"测量"放在第一位。
感觉先行 vs 数据先行
| 模式 | 典型行为 | 结果 |
|---|---|---|
| 感觉先行 | "我觉得是蓝图慢,全部改 C++" | 两周后帧率没变,代码不可维护了 |
| 数据先行 | "Insights 显示这个函数占 4ms" | 半天改完,帧率达标,可写进文档 |
感觉先行的问题不是"不专业",而是人眼无法分辨几毫秒级别的差异:30Hz 到 45Hz 的卡顿,多数人只能说"感觉不流畅",说不清是哪里。
一个真实的最小代价循环
正确的优化循环只有四步:
- 测量:用工具拿到当前帧时间与热点分布;
- 假设:根据数据提出"最可能的瓶颈";
- 验证:只改这一处,再测一次;
- 记录:把前后对比写进文档(不带数据的优化经验不值得分享)。
关键纪律:第 3 步如果测不出改善,就立刻回滚。改了一堆但帧率没动 = 代码变脏了而问题还在。
性能优化的三个真相
- 帕累托法则:90% 的时间花在 10% 的代码上。优化的全部工作就是找到那 10%;
- 过早优化是万恶之源(Knuth):未测量前的"顺手优化"通常带来复杂度而没有收益;
- 优化是 trade-off:用可读性 / 维护性换性能,所以每笔交易都要明码标价(记下来"为了 2ms 牺牲了什么")。
什么时候停止优化
达到预算就停。帧率达标(如 60Hz 稳定)之后继续优化是沉没成本。把"够用"定义为可量化的目标(目标帧率 + 目标内存 + 目标加载时间),而不是"尽可能快"。
