性能优化方法论系列目录
《一、性能优化的本质》《二、性能优化方法论的思想源泉》
《三、性能优化的核心思想(1)》
《三、性能优化的核心思想(2)》
《三、性能优化的核心思想(3)》
《四、性能优化的注意事项》
《五、实际案例分析》
《六、总结》
本小节介绍自己对性能优化方法论的思想来源。
1 核心思想
1.1 开源和节流
既然,性能问题是“良好的用户体验和有限的资源之间的矛盾” 导致的。
那么,我们如何解决这个矛盾呢?换句话说,资源不足怎么办?
我们可以将问题进行转化,换个问法:“如果你这个月钱不够花怎么办”?
可能很多人会说:想办法多挣点,比如多加点班(如果有加班费的话)、多干一些兼职、可以向朋友借点,可以省着点花。
这些方法的背后闪烁着两个重要思想:“开源和节流”!!
开源,即投入更多的资源。如增加更多服务器、提高服务器的配置,投入更多的开发人员等。
节流,即提高资源利用率,减少资源浪费。如采用时间复杂度更低的算法,通过压缩来降低存储和传输的数据量等。
1.2 堆“硬件”、升“软件”
从宏观上讲,计算机是由硬件和软件组成的。
那么,如何让一个计算机性能更好呢?
一般来说,需要:堆硬件、升软件。如提高硬件配置,对软件进行优化。
其实性能优化的主要方法也来源于此,性能优化的宏观思路就是 “堆硬件,升软件”。
这里的硬件指机器的数量和机器的配置等;软件包括优化算法、架构等。
本质上和开源节流的思想是一致的。
1.3 权衡 (trade-off)
大家找工作很难找到“钱多、事少、离家近”的工作。然而现实情况是,通常只能得其中一二。
性能优化很多时候也是一种权衡,在性能优化的路上,通常要做:用户体验和成本的权衡,投入产出比的权衡。
很多团队在产品研发初期人力资源有限,加上快速上线的压力,一般看重满足功能要求,只要不出现难以接受的性能问题即可。此外,项目也有优先级,可能另外一个项目优先级非常高,性能优化的事情可能就暂时延后。不管是通过“堆硬件” 还是通过“升软件” 的方式进行性能优化,都会面临着低延时和高成本的矛盾。
然而一般来说,用户体验和成本成反比,架构师或者开发人员要做的是,根据产品发展阶段和资源的情况去考虑性能优化的问题。
不管是从产品的发展阶段,还是团队内项目的优先级,还是技术角度上性能优化的投入和产出比来说,性能优化都不是简单地追求“最优化”,而是需要结合实际情况寻找优化的平衡点。
2 具体来源
前面讲到性能优化的核心思路是:开源和节流,堆硬件和升软件,对很多人来说太宏观。
那么如何寻找靠谱的具体的性能优化方法呢?
2.1 经典论断
一些计算机科学、软件工程的一些经典论断,如 David Wheeler 的经典论断:
"“All problems in computer science can be solved by another level of indirection” (the fundamental theorem of software engineering)
即计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决 (软件工程的基础理论)
如在数据库和用户访问之间增加缓存层,可以极大加快访问速度;在写操作和磁盘中间增加内存缓冲区这个中间层,极大提高了 IO 的性能;再比如在应用程序和数据库之间,增加分库分表中间件作为中间层,突破了单库限制,提高了读写性能。如下图所示,在应用服务层和数据访问层中间增加领域层,可以更好地表达业务,更好地封装变化,实现更好高内聚、弱耦合的目标。
2.2 百花齐放
此外,专业基础是性能优化灵感的重要来源,如 CPU 的多级缓存思想、文件缓冲区的思想、进程调度算法等。
不同的数据结构都有自己的特点,都是为了解决某一类问题,适合某些场景,有其优缺点。选择合适的数据结构也可以实现性能优化。
不同的算法的时间和空间复杂度也各不相同,选择性能更优的算法也可以提高性能。
很多架构就是为了性能优化而设计的,如读写分离、分库分表、分布式架构;
很多中间件的设计中体现出诸多性能优化的思想,如 ES 的倒排索引、索引刷盘机制;
JDK 源码和很多优秀的开源项目也包含着很多性能优化的典型实践,如内存缓存、分段加锁、写时复制等。
创作不易,如果本文对你有帮助,欢迎点赞、收藏加关注,你的支持和鼓励,是我创作的最大动力。