性能优化指南:性能优化的一般性原则与方法

作为程序员,性能优化是家常便饭,无论是桌面应用还是网页应用,无论是前端还是后端,无论是单点应用还是分布式系统 。本文从以下几个方面考虑这个问题:性能优化的一般原则、性能优化的层次和性能优化的一般方法 。本文不限于任何语言、框架,可能会以语言为例 。

性能优化指南:性能优化的一般性原则与方法

文章插图
不过由于个人经验,可能更多是从Linux服务器的角度来考虑这些问题 。
一般原则
基于数据,而非猜测
这是性能优化的第一原则 。当我们怀疑性能有问题时,我们应该通过测试、记录日志来分析问题出在哪里,并针对它进行定位,而不是靠感觉和运气 。如果一个系统出现性能问题,瓶颈可能是 CPU、内存或 IO(磁盘 IO、网络 IO) 。对于一般方向,您可以使用 top 和 stat 系列来定位 (,, &;) 。可以使用 .
在本文中,主要关注与 CPU 相关的性能问题 。根据 80/20 法则,大部分时间都花在了少量的代码片段上 。找到这些代码唯一可靠的方法是我所知道的所有编程语言都有相关的工具 。熟练使用这些工具就是性能优化 。第一步 。
避免过早优化
真实的是,他们在错误的时间和错误的时间花费了太多时间;是所有邪恶(或至少大部分)的根源 。
我不太清楚 Knuth 名言的背景,但我同意这个想法 。在我的工作环境(以及典型的互联网应用开发)和编程模式下,追求的是快速迭代和试错,过早的优化往往是无用的 。而且,过早的优化很容易被打败,优化点往往不是真正的性能瓶颈 。
避免过度优化
As 是 a 的一部分 – 缓慢的 a 不适合
性能优化的目标是追求合适的性价比 。
在不同的阶段,我们会对系统的性能有一定的要求,比如应该达到多少吞吐量 。如果达不到这个指标,就需要优化 。如果能达到预期,那就不用再花时间精力去优化了 。比如只有几十个人使用的内部系统,不需要按照10万在线的目标进行优化 。
而且,后面会提到,有些优化方法是“有损”的,可能对代码的可读性和可维护性产生副作用 。这时候,就更难过度优化了 。
对业务的深刻理解
代码是给企业的,也许是给最终用户的,也许是给其他程序员的 。不了解业务,就很难了解系统的流程,也很难发现系统设计的不足 。业务理解的重要性在后面也会提到 。
性能优化是一场持久战
当核心业务方向明确后,就应该开始关注性能问题 。项目上线后,还要继续进行性能测试和优化 。
如今的互联网产品已经不是一蹴而就,上线后需要不断开发,用户的大量涌入也会带来性能问题 。因此,需要自动检测性能问题,维护稳定的测试环境,不断发现和解决性能问题,而不是被动地等待用户投诉 。
选择正确的指标、测试用例、测试环境
因为性能优化是一个长期的行为,所以需要固定测量指标、测试用例、测试环境,从而客观地反映性能的实际情况,展现优化的效果 。
衡量性能的指标有很多,比如系统响应时间、系统吞吐量、系统并发度等 。不同系统的核心指标不同 。首先要明确系统的核心性能需求,固定测试用例;其次,要兼顾其他指标,不能忽视其他指标 。
测试环境也很重要 。有一次,我们突然发现我们的 QPS 高了很多,但是程序根本没有优化 。查了半天,发现我们换了一台更强大的物理机作为测试服务器 。
性能优化级别
根据我的理解,可以分为需求阶段、设计阶段、实现阶段;阶段越高,优化效果越明显,对业务和需求的理解越深入 。