编程进阶网 编程进阶网
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接

杨充

专注编程 · 终身学习者
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接
  • README
  • 性能优化实践

    • README
    • 公共方法论

      • 性能工程总论原理
      • 跨平台指标体系
      • 性能求证方法论
      • 数据采集与观测
      • 归因方法与火焰图
      • 性能预算防劣化
      • 性能体系全景图
      • 性能优化误区集
      • 体系建设篇

      • 资源专项篇

      • 流水线专项

      • 业务专项篇

      • 交付防御篇

    • 程序编程原理

    • 稳定性与可靠性

    • 工程化与运维

    • 方案设计思想

    • 专栏
    • 性能优化实践
    • 公共方法论
    杨充
    2026-05-27
    目录

    性能优化误区集

    # 性能优化误区集

    📊 学习成本预估 | 难度:⭐⭐⭐(3/5)| 阅读:约 15 分钟 | 实操:无(仅阅读) 🔗 前置阅读:— | ➡️ 后续延伸:全栏文章

    本文集中梳理性能领域 20 个最常见的认知误区——它们不是单纯的"知识盲区",而是被工程界广泛传播、被资深工程师重复犯下的错误经验。 每条误区都给出:反直觉点 / 真相 / 数据 / 关联章节。

    # 目录介绍

    • 00.开篇
    • 01.指标类误区
    • 02.资源类误区
    • 03.流水线类误区
    • 04.业务类误区
    • 05.方法论误区
    • 06.总结

    # 00 开篇

    # 0.1 为什么单独成篇

    性能领域的"经验"特别容易过时——5 年前的最佳实践今天可能成了反模式(如 Android MultiDex),10 年前的常识今天可能已彻底失效(如 SSD 仍随机读慢)。本文把高频误区集中起来,每读完一条都比读一篇文章的密度更高。

    # 0.2 怎么用

    • 第一次读:通读一遍,标记你"中招"的条目
    • 遇到性能问题时:先看本文相关条目,避免误判方向
    • 代码评审时:作为 Checklist,挑出新写的代码中的误区

    # 01 指标类误区

    # 1.1 平均值 = 用户体验?❌

    误区:avg_fps = 58 就是流畅。

    真相:用户感受的是"最差那帧"。58 平均可能是"95% 帧 60fps + 5% 帧 5fps",那 5% 比纯 30fps 更刺眼。

    数据:抖动率(帧时差方差)相同的情况下,「均匀掉帧」体感比「集中掉帧」好 3-5 倍。

    正确:用 P99 / P99.9 + Jitter 替代均值。详见 卷三·02 FPS。

    # 1.2 全量上报数据更准?❌

    误区:采样会"丢数据",全量更可信。

    真相:全量在端上压垮 CPU/带宽,反而触发"被丢弃 + 不上报",比有控制的采样丢得更多。1% 采样的 P50/P90 偏差 < 1%,但成本只有 1%。

    数据:实测全量上报情况下,30% 设备因熔断保护停止采集;用户级 hash 分桶 5% 采样,覆盖率 ≥ 99%。

    正确:核心 KPI 全量、长尾问题分桶采样、高频事件边缘聚合。详见 卷一·03 数据治理。

    # 1.3 P99 = Top 1% 用户体验?❌

    误区:P99 = 99% 用户都比这值好。

    真相:P99 是"采样里的 P99"。如果采样有偏(如低端机不上报),真实 Top 1% 长尾可能比 P99 差 5-10 倍。

    正确:分层采样(低端机 100%、中端 10%、高端 1%);用 TDigest 保留分布形状。详见 卷零·02 指标体系。

    # 1.4 修了 bug,曲线下降 = 真的好了?❌

    误区:发版后曲线下降,就是优化生效。

    真相:可能是 SDK/协议变更导致部分上报字段被丢弃;可能是用户分布变了(活跃用户偏向高端机);可能是采样桶变了。

    正确:每次发版都要做"上报量同比"+"用户结构同比"校验,断崖式下降几乎都是数据问题。详见 卷一·03 数据治理。


    # 02 资源类误区

    # 2.1 CPU 高 = 性能差?❌

    误区:CPU 占用 80% 必须降下来。

    真相:CPU 高分两种——计算型 high(在干正事)和 wait 型 high(在等锁/IO/网络)。前者代表"在好好干活",往往不是问题;后者才是真问题。

    数据:实测某图像处理场景 CPU 持续 90%,反而代表 NEON 指令充分利用,是优化的成功;某网络等待场景 CPU 仅 20%,但用户感知卡死。

    正确:用 on-CPU + off-CPU 双采样,区分等待与计算。详见 卷二·01 CPU。

    # 2.2 内存低 = 不会 OOM?❌

    误区:当前 PSS 200MB 远低于上限,安全。

    真相:OOM 取决于"未来内存峰值",不是"当前值"。一次拍照、一次大图加载、一次列表数据爆发,都能让内存瞬间翻倍。

    数据:某 OOM 案例中,崩溃前 100ms PSS 仍是 250MB,崩溃瞬间冲到 450MB(图片解码 + Bitmap 拷贝 + GC 未及时)。

    正确:监控内存 P99 + 增长率,关注峰值不关注均值。详见 卷二·02 内存。

    # 2.3 SSD 随机不比顺序慢?❌

    误区:现代 SSD 没有顺序/随机差异。

    真相:读基本无差,但写仍有 2-5x 差异——SSD 写受"擦写块(256KB-4MB)"约束,随机小写会触发"读-擦-写"放大。

    数据:实测 100MB 数据,1 个大文件写 0.8s;1 万个 10KB 小文件写 22s(27x 慢)。

    正确:批量写、聚合存储、避免小文件。详见 卷二·06 IO。

    # 2.4 多线程 = 一定更快?❌

    误区:什么都丢线程池就能加速。

    真相:异步切换有 0.4-0.8ms 固定开销;任务本身 < 1ms 时,异步反而比同步慢。线程数过多还会引入锁竞争、上下文切换开销。

    数据:阿姆达尔定律实测,可并行部分 P=0.7 时,无论开多少线程,加速上限是 1/(1-0.7) = 3.3x。

    正确:先测量同步耗时,> 5ms 才考虑异步;线程数 = CPU 核数 × 2 是经验上限。详见 卷二·04 线程 + 卷四·01 启动。

    # 2.5 多进程 = 省内存?❌

    误区:把模块拆到独立进程,主进程更稳更快。

    真相:进程总内存 = 各进程之和,反而更高(每个进程都有 Zygote 拷贝、JVM 等基础开销);进程间通信(IPC)有额外延迟。

    数据:某 App 把图片库拆出独立进程,主进程内存降 30MB,但总内存增 60MB;IPC 调用平均延迟 8ms。

    正确:多进程只用于隔离崩溃风险或绕过单进程内存限制,不是"省内存"。详见 卷二·05 进程。


    # 03 流水线类误区

    # 3.1 60fps 一定流畅?❌

    误区:FPS 60 = 用户不会觉得卡。

    真相:60fps 平均不代表 60fps 稳定。一秒内 50 帧 16ms + 10 帧 33ms = 平均 18ms ≈ 56fps,但用户感受是"明显不顺"。

    正确:FPS P95 ≥ 55、P99 ≥ 50;同时看 Jitter(连续两帧时差方差)。详见 卷三·02 FPS。

    # 3.2 开硬件加速 = 一定更快?❌

    误区:所有 View 都开 layerType=hardware。

    真相:开了硬件加速 = 该 View 独占一个 GPU layer(占显存 + 增加合成成本)。开太多触发"层爆炸",GPU 反而成瓶颈。

    数据:实测过度绘制 ≥ 5 倍 + layer 数 > 200 时,GPU 帧合成时间从 4ms 涨到 25ms。

    正确:硬件加速只用于频繁动画的视图;静态视图保持默认。详见 卷三·01 渲染。

    # 3.3 ANR = 一定主线程卡死?❌

    误区:ANR 就是主线程死循环或长任务。

    真相:ANR 还可能是:①Binder 调用阻塞(系统服务慢);②输入派发被堵;③Watchdog 误报;④Service onCreate 慢。其中 Binder 阻塞最难定位(栈停在 IPC 等待)。

    正确:抓 ANR trace 时同步抓 system_server 状态;区分主线程栈帧 vs 系统状态。详见 卷三·04 ANR。

    # 3.4 transform 替代 left/top 一定更快?✅ 但有边界

    误区:所有动画都改 transform 就万事大吉。

    真相:transform 走合成器是对的,但 will-change: transform 全局开 = 全部晋升合成层 = 显存爆炸 = 反而更慢。

    正确:只对当前正在运动的元素加 will-change,动画结束后移除。详见 卷三·06 动画交互。


    # 04 业务类误区

    # 4.1 异步加载 = 启动一定更快?❌

    误区:把所有初始化丢异步线程,启动时间立刻下降。

    真相:异步任务的"创建 + 调度 + 同步等待"有固定成本。小任务(< 5ms)异步反而损失启动时间;阿姆达尔定律决定了无限并发也有上限。

    数据:某启动优化把 50 个任务全异步化,启动时间从 1200ms 反升到 1450ms;保留同步部分,剩 15 个异步,降到 850ms。

    正确:先用关键路径分析找出"必须串行"的任务,剩下的才异步。详见 卷四·01 冷启动。

    # 4.2 缓存命中率 = 性能指标?❌

    误区:图片缓存命中率 95% = 性能很好。

    真相:命中率高不代表用户体验好——可能是用户根本没怎么滚到新图。真正指标是「显示时延」:从需要图到显示出来的时间。

    正确:观察 P95 图片显示时延,命中率只是辅助指标。详见 卷四·03 图片。

    # 4.3 重试 3 次 = 提升成功率?❌

    误区:失败立刻重试 3 次,请求成功率从 70% 涨到 90%。

    真相:在弱网"抖动型"环境下,立即重试三次往往三次都打在抖动期内;而且服务端被加倍压力可能进入雪崩。

    数据:实测固定间隔重试成功率 65%;指数退避 + jitter 成功率 87%。

    正确:所有重试用指数退避 1s/2s/4s,加 jitter,最多 3 次。详见 卷五·04 弱网。

    # 4.4 暗黑模式 = 一定省电?❌

    误区:暗黑模式 = 省电模式。

    真相:OLED 屏(iPhone X+, 大部分旗舰 Android)暗黑省电(黑像素不亮,省 60% 屏幕功耗);LCD 屏(千元机大量)背光始终全亮,暗黑模式不省电。

    正确:先判断屏幕类型再做差异化提示;不要无脑推暗黑模式。详见 卷四·05 功耗。

    # 4.5 长连接 = 比短连接更省电?❌

    误区:HTTP keep-alive 始终更省电。

    真相:长连接需要心跳保活,心跳间隔 < 5 分钟时反而比短连接更耗电(每次心跳触发 5-10 秒 tail time)。

    正确:心跳间隔 ≥ 5 分钟;非长期通信场景优先短连接。详见 卷四·05 功耗 + 卷五·04 弱网。


    # 05 方法论误区

    # 5.1 看 Top 函数找瓶颈?❌

    误区:火焰图看哪个函数最高就优化哪个。

    真相:火焰图 Top 函数只代表"被采样最多",不代表"耗时最长"或"最值得优化"。可能是高频调用但每次很快,优化它收益有限。

    正确:看"自顶向下的关键路径"——从入口看哪条路径加起来最长。详见 卷零·05 归因。

    # 5.2 测一次就下结论?❌

    误区:跑一遍 benchmark,"果然快了 20%"。

    真相:单次测量噪声极大(GC、热缓存、温度、调度),20% 差距完全可能是噪声。

    正确:至少跑 10 次,看中位数 + 四分位距;前 3 次冷启动数据丢弃。详见 卷零·03 求证方法论。

    # 5.3 优化完就完事?❌

    误区:性能问题修了,可以转身做业务了。

    真相:性能优化的成果天然会被新功能侵蚀——3 个版本后大概率回到原点。

    正确:必须有"防劣化"机制:CI 卡口 + 性能预算 + 线上 SLO。详见 卷零·06 防劣化。

    # 5.4 这是"通用经验",跨平台都适用?❌

    误区:Android 上的最佳实践直接照搬到 iOS。

    真相:原理跨平台同构,但实现差异巨大。比如 Android 用 SharedPreferences 一定要换 MMKV,但 iOS NSUserDefaults 性能足够好;Android RecyclerView 要 setHasFixedSize,iOS UICollectionView 没有这个 API。

    正确:先理解第一性原理,再查平台特异实现。详见 卷零·01 总论。


    # 06 总结

    # 6.1 误区分布规律

    类别 高频指数 修正难度
    指标类 ⭐⭐⭐⭐⭐ 难(需重建指标体系)
    资源类 ⭐⭐⭐⭐ 中(需深入剖析)
    流水线类 ⭐⭐⭐ 易(有明确数据可证)
    业务类 ⭐⭐⭐⭐ 中(需做对照实验)
    方法论类 ⭐⭐⭐⭐⭐ 最难(认知改造)

    # 6.2 误区背后的共同特征

    • 「平均」的诱惑:人脑天然偏好简单数字,但性能问题永远在长尾
    • 「直觉」的陷阱:经验在新平台/新场景往往失效
    • 「单次」的偷懒:测一次就下结论,是性能领域第一大敌
    • 「不验证」的傲慢:依赖经验而不是实验,是性能优化最容易翻车的源头

    # 6.3 三条破误区的元原则

    1. 看分布不看均值——P95/P99 永远比 mean 更接近真相
    2. 做实验不靠经验——任何"我觉得"都要变成"我测过"
    3. 抓原理不抄 API——跨端跨平台的本质是原理而非实现

    性能优化是一门"反直觉"的工程学科——每多躲过一个误区,就比同行快一步看到真相。

    上次更新: 2026/06/07, 10:26:12
    性能体系全景图
    应用APM的设计

    ← 性能体系全景图 应用APM的设计→

    最近更新
    01
    信号崩溃快速排查
    06-15
    02
    CoreDump破案
    06-15
    03
    perf火焰图实战
    06-15
    更多文章>
    Theme by Vdoing | Copyright © 2019-2026 杨充 | MIT License | 桂ICP备2024034950号 | 桂公网安备45142202000030
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式