代码级性能优化实例分析
|
厂加工产品所需要的原材料需要从外面的大型仓库运输过来。由于从工厂外大型仓库到工厂的距离比较远,耗时比较长,因此总是有计划的,批量的将物料从工厂外的大仓库运输到工厂内的小仓库。工厂的车间突然需要一些原材料,那就只能让火车重新跑一趟了。 运输过来的原材料不能乱放,否则要是下雨刮风啥的不就损坏了。因此,原材料会被统一的放在工厂内的小仓库(CPU缓存)里面,各个车间根据需要从小仓库运输原材料到车间。 在车间有个暂存区(寄存器),用于存放从小仓库运过来的材料。当然暂存区除了放原材料之外,还会放一些半成品和成品。车间有车间的秩序,不能乱放,否则会出问题的。暂存区是很有必要的,要不然需要点材料就去仓库拿,那不得类似工人啊原材料之后,工人就可以将原材料放到生产线(ALU)上进行生产了。生产完成的成品又会放回暂存区,然后运输出去。暂存区和生产线都在车间里面,搬运原材料和成品都很快,几乎是一两分钟就可以完成。 关于流水线 为了提高产品生产速度,在一个车间里面通常是有多个生产线的。每一个生产线的大概流程是运输原材料、原材料预处理(比如撕掉包装或者切成小块等)、原材料加工和成品运回暂存区等步骤。CPU也是有类似的流水线的,任何一个指令都要经过读取指令、译码、执行和写回(寄存器或者内存)等。 以一个生产黄桃罐头的车间为例,在这个车间里面要同时生产罐头瓶、罐头瓶盖和糖水黄桃(这里是假设,实际工厂不是这样)。因此,也就有生产罐头瓶的流水线、生产罐头瓶盖的流水线和生产糖水黄桃的流水线。通常我们安排的流程是先生产罐头瓶和瓶盖,这样生产的糖水黄桃就可以装瓶完成成品了。但是,有的时候可能运送暂存区或者工厂的小仓库没有玻璃了,这样就没法生产罐头瓶。不过没关系,车间还是可以先生产糖水黄桃的,生产完之后先放到暂存区,等什么时候罐头瓶生产完之后在装瓶。 上面这个流程其实就是所谓的指令乱序。也就是CPU在执行指令的时候并不是按我们写代码的顺序执行的,而可能会打乱顺序。比如下面这段代码,由于两行代码之间没有任何依赖,因此在CPU中可能会先执行b=2,后执行a=1。来说越往金字塔底部,容量越大,但延迟也越大,性能越差。这里面有个特例,就是本地存储和远程存储,如果远程存储采用的介质与本地相同,则肯定远程存储性能要差一些。但当前有些分布式存储,通信链路采用RDMA,存储介质采用SSD,那么本地的机械磁盘就要比远程存储性能差了。 了解了这个结构之后,我们总结一下。其实性能问题总结起来就是一句话,尽量少的使用计算资源(比如不同的排序算法),尽量多的用金字塔顶部的部件存储要访问数据(比如文件系统的缓存)。 程序性能分析工具 正所谓:“欲善其事,必先利其器”。因此,要想进行性能优化,自然需要有相应的工具进行分析。本文仅针对Linux操作系统进行介绍,其它操作系统实在是不熟悉。在Linux操作系统下面,用的最多的性能分析工具恐怕非top莫属。 (1) top命令
top命令可以实时的观察进程的计算资源使用情况(CPU利用率)和整个系统的综合负载。如图是我们通过一个Python脚本模拟高负债程序,可以看到起CPU利用率已经达 (编辑:桂林站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


