结合大学时计算机组成原理老师的教导,和本人积累的经验和思考,将一些系统性能优化的套路总结了一下。不包含具体的优化场景,只提供方向。
所以本文看起来会有点废话连篇。
1. Profiling
系统优化之前最重要的是profiling,profile有“画像,轮廓”的意思,可以理解为对整个系统进行摸底,看一下每个过程需要多长时间,过程是并行的还是串行的等等。
在profiling完成之后,应当能区分出流程中的子系统。
子系统区分如何完成,主要看耗费时间的数量级。
数量级差不多的流程,就可以划分到一个子系统里。
子系统划分出来,按照流程连接,就形成一个DAG,求出关键路径之后,优化的工作才能启动。
2. 子系统的优化
在子系统中,时间耗费的数量级一样,因此第一条优化思路就是加快经常性事件。
对于程序优化,就是找热点函数。各语言都有自己的profiling工具,这里不细讲。
问题来了,如何加快经常性事件?
有下面几种套路
3. 使用更优的算法
我们可能创造不出快排这种算法,也想不出红黑树这种数据结构。
但是有一些套路还是比较简单的。
比如:
预先处理
比如预先计算,预先申请,预先读取等等。
预先计算就是先将所有可能的结果计算出来,外部需要的时候直接取。
增量处理
增量处理算法上也要做支持,这里的例子就太多了。
比如数据库的增量备份和同步,文件的增量打包和同步等等。
批量处理
将原本需要多次传输、多次写入或多次读取的操作,改成一次批量处理。
4. 使用更快的存储器
mysql换成redis,硬盘换成内存,内存换成cache,使用更快的存储器来存储你的数据,可以显著提升效率。
在实践上,我们用redis存储不太重要的数据;把文件加载到内存,不用每次读取;给CPU加上L1 Cache,L2 Cache,不用每次从内存中取。
5. 使用更多的CPU
这里包含两个方向:一个是从单线程到多线程的优化,一个是多线程之间的优化。
单线程到多线程的优化,可能会受到场景的限制,有些场景可能本来就是串行的,无法进行多核优化。
多线程之间的优化,就是同步手段的优化,比如互斥锁改为读写锁,一些简单的场景,可能原子操作就能满足要求。
一些压缩算法,是可以并行处理的,利用多核的优势,可以很轻松的减少50-75%的时间。
总结
总体来看,优化的方向在于计算,存储,并行三大方向,当然这三个方面也要相互配合才能达到最佳效果。