年薪80W的架构师总结:性能优化其实不难,记住这十条策略就够了

上一篇文章 , 我们聊了性能优化的六大原则 。原则有了 , 但是在针对实际的性能问题的时候 , 用什么样的解决方案才可以提升性能呢?这就需要你了解具体的优化策略了 。
现实中的性能问题和具体领域千差万别 , 我也不可能面面俱到 。但是为了帮助你理解 , 我总结了十大常用的优化策略 。

年薪80W的架构师总结:性能优化其实不难,记住这十条策略就够了

文章插图
 
我将这十大策略分成五个类别 , 每个类别对应两个相关策略 , 帮助你掌握 。这五个类别是:时空相互转换、并行 / 异步操作、预先 / 延后处理、缓存 / 批量合并、算法设计和数据结构 。我们现在一个个来讲 。
一、时空转换第一个策略类别是“时空转换” 。我们看科幻电影和小说的时候 , 经常会看到时空转换这个题材 。性能优化里面有两个策略恰好组成了这个类别 , 包括“用时间换空间”和“用空间换时间”这两个看似互相对立的策略 。
1. 用时间换空间
用时间换空间的策略 , 出发点是内存和存储这样的“空间”资源 , 有时会成为最稀缺的资源 , 所以需要尽量减少占用的空间 。比如 , 一个系统的最大性能瓶颈如果是内存使用量 , 那么减少内存的使用就是最重要的性能优化 。
这个策略具体的操作方法有几种:
  • 改变应用程序本身的数据结构或者数据格式 , 减少需要存储的数据的大小;
  • 想方设法压缩存在内存中的数据 , 比如采用某种压缩算法 , 真正使用时再解压缩;
  • 把一些内存数据 , 存放到外部的、更加便宜的存储系统里面 , 到需要时再取回来 。
这些节省内存空间的方法 , 一般都需要付出时间的代价 。
除了内存 , 还有一种常见的场景是 , 降低数据的大小来方便网络传输和外部存储 。压缩的方法和算法有很多种 ,  比如现在比较流行的 ZStandard(ZSTD)和 LZ4 。这些算法之间有空间和时间的取舍 。
衡量任何压缩算法 , 基本上看三个指标:压缩比例、压缩速度以及使用内存 。
如果系统的瓶颈在网络传输速度或者存储空间大小上 , 那就尽量采取高压缩比的算法 , 这样用时间来换空间 , 就能够节省时间或者其他方面的成本 。
2. 用空间换时间
“用空间换时间”就是对“用时间换空间”策略反其道而行之 。有些场景下 , 时间和速度更加重要 , 但是空间尚有富余 , 这时我们就可以考虑用空间来换时间 。
这里要注意的一点是 , 我们后面还会讲一条关于使用缓存的策略 。虽然缓存的策略理论上也是一种“空间换时间”的方式 , 但我们在这里把它分开来讲 , 这是因为缓存策略的“空间”定义与一般的“空间换时间”不同 。一般来讲 , “缓存”使用的空间 , 和原来的空间不在同一个层次上 , 添加的缓存往往比原来的空间高出一个档次 。而我们这里“空间换时间”的策略 , 里面的“空间”是和原来的空间相似的空间 。
互联网的服务往往规模很大 , 比如全国的服务甚至是全球的服务 。用户分布在各地 , 它们对访问时间的要求很高 , 这就要求被访问的数据和服务 , 要尽量放在离他们很近的地方 。“空间换时间”就是对数据和服务进行多份拷贝 , 尽可能地完美覆盖大多数的用户 。我们前面讲过的 CDN 内容分发网络技术就可以归类于此 。
其实我们部署的任何大规模系统 , 都或多或少地采用了用空间换时间的策略 , 比如在集群和服务器间进行负载均衡 , 就是同时用很多个服务器(空间)来换取延迟的减少(时间) 。
二、预先和延后处理优化策略的第二大类是“预先和延后处理” , 这一类别也有两个互相对立的策略 。一个是预先或者提前处理 , 另外一个是延后或者惰性处理 。
3. 预先 / 提前处理
预先 / 提前处理策略同样也表现在很多领域 , 比如网站页面资源的提前加载 。Web 标准规定了至少两种提前加载的方式:preload 和 prefetch , 分别用不同的优先级来加载资源 , 可以显著地提升页面下载性能 。


推荐阅读