性能优化泛泛谈:原则、系统和本质

如果抛出一个开放式问题:谈谈你对性能优化的理解?你会如何回答呢?
我们来“泛泛而谈”下吧。
从这么三个角度来聊聊:原则、系统和本质。

1. 原则

性能优化本身是一个大问题,如果只是随意谈某些场景下的某些优化方法,往往会片面化。
所以,我们的回答就必须高度抽象,跳出场景本身,找到普适性的规律,也就是原则,原则>方法>案例。
性能优化的基本原则是什么?
辩证法的基本原则是具体问题具体分析,性能优化亦是如此:具体案例具体分析。
这个回答看似跟没说一样,但做到却不容易。我们经常说不要过早优化,但什么时候算早,什么时候刚刚好,这只有放到具体的案例中才能得到答案。
基于这个原则,在性能优化时不妨问自己这么几个问题:

  1. 我们的案例/产品/场景/需求是什么?
  2. 优化的目的是什么,标准是什么,是否有必要?
  3. 为了达到优化目的,必须这么优化吗,只能这么优化吗?

只有最终的目的确认之后,优化方向不会走偏,并且才有推进过程中的比对标准。

2.系统

前面谈了原则,似乎接下来要谈方法了。
像对于SQL,算法之类的优化有各自具体的手段,所谓具体场景具体分析,是不是看到数据库场景就去找SQL方面的优化,看到算法场景就找算法方面的优化呢?
当然不是的,这又是只见树木,不见森林,落入细节了。
任何一个软件,都不是简单的数据库或算法方面的组合,而是一个系统,我们必须站在系统角度去思考问题。
系统思考中有一个基本的原则,叫跳出系统看系统。
而跳出系统是一个方法是向上归类,话术是X属于什么?X是什么的一部分?
性能优化属于什么?我们可以回答属于技术。
技术又属于什么?技术属于产品。
当然,从公司职位来看,技术同学和产品同学是平级的关系,但从最终交付给用户的产品成果来看,技术只是产品的一部分。
我们向上归类了两层,接下来就可以向下展开来看系统组成了。

我这里就按通常的组成展开了,产品=业务+技术+运营,技术=开发+测试+运维,然后性能优化属于技术的一部分。
既然是系统思考,我们就可以提出如下问题了。
性能优化会对产品体系的产生什么影响?从产品体系的角度来看怎么做能更好?
这是在说什么呢?
举个例子。
一个数据处理任务每次都要跑半个小时,从技术上来讲很慢,可以做优化。但是,结合业务却发现,这个任务半年跑一次,如果优化得投入一周,这个投入就不见值得了。
另一个例子,数据库有一部分数据被使用得很频繁,看起来要做优化,但去调查使用方的业务,发现他们根本没实现功能,不需要来拿数据,直接让他们停掉操作就可以了。
也就是说我们不应该一开始从纯技术的角度思考如何做性能优化,而是结合实际的业务需求,系统思考如何优化。
再来看一个技术体系方面的例子。
通常越是靠近计算机体系底层的性能越好,这就有一些优化的技巧,比如用汇编来代替高级语言如JAVA的实现,用数据库的存储过程来代替编程语言的ORM,从开发的角度来看,能大大提升性能,但从运维的角度这是不好维护代码,运维成本就增加了。
因此,从系统思考的角度,我们不能为了纯粹的性能而优化,那要怎么做呢。
回到我们的原则:具体案例具体分析。
一般来说,面向前台用户,变化快的场景,应当适当牺牲性能,以换来开发、测试和运维的效率;
面向底层,变动小的场景,可以牺牲开发,维护效率来追求极致的性能。
从产品、技术体系的角度来思考性能优化的问题,看似复杂很多,但却能有效防止进入头痛医头的误区,更好的把握性能优化真正的目的。

3.本质

最后一个角度,来谈淡性能优化的本质。
当谈到事物的本质时,有两个方向,第一个是抬头看,这个事物目的/目标是什么?另一个是低头看,这个事物究竟是什么?
回到性能优化上,便是性能优化的最终目的是什么?这个问题的答案,在上文的系统中已经有了一部分,那就是从产品体系,技术体系去思考性能优化是为了什么,但还没有触碰到最终目的,不卖关子,最终目的是一个词-效率。
并且不是单方面的效率,而是综合效率,这就是为什么要从系统的角度思考性能优化的原因。
明白最终目的,第二个问题是,性能优化究竟在优化什么?就有答案了。
表面上来看是一些代码和流程的变动,但其实效率背后是两个基本的物理量:时间和空间。
那么优化的手段其实本质上只有三种了:

  1. 优化时间
  2. 优化空间
  3. 时空互换:用时间换空间,或者用空间换时间。

我们把视角拉回来,算法的效率怎么衡量,时间复杂度和空间复杂度。
同样的,各类压缩算法做了什么?用时间换空间,用压缩的带来的时间成本来降低存储和传输的空间成本。
缓存做了什么?用空间换时间,用缓存服务器的空间成本降低程序执行的时间成本。
当然我们也可以用一些物理学公式来思考这个问题。
T=S/V,即时间=路程/速度,我们可以抽象为时间=空间/速度。
在网络传输中,光纤的速度是光速,这是固定的。因此,在速度一定的情况下,要降低时间的唯一手段是压缩空间。
一个很典型的例子便是CDN(内容分发网络),它本质上是在降低S,让用户从最近的CDN节点获取所需数据,从而提高效率。
除此之外,像多地多机房部署除了有容灾的考量外,时间方面效率也是它的目的之一。
这就有了我们平时做性能优化的最终手段了,除了优化时间,优化空间,还可以通过牺牲时间或空间的手段进行时空互换。
当想不出优化手段时,不妨问问自己,还可以用时间换空间吗?还可以用空间换时间吗?或许有新的灵感。
当然,一个时间才是金钱的社会,当然往往是以牺牲空间为主了,这又是另一个话题了。
以上,感谢阅读。

参考

初开:什么是系统思考?
永澄:原则 > 方法 > 实例
常见性能优化策略的总结

Comments
Write a Comment