工作四年,我是如何有针对性的对代码进行性能优化?其实很简单(干货)

ぃ、小莉子 提交于 2020-02-14 18:01:49

不想去成为一个伟大的程序员,只想成为一个具有良好习惯的优秀程序员。

前言

在四年工作经历中也负责了一些系统关键的性能优化,其实一些系统的优化方法是很简单的,不像我们想象中的那么困难。之前有带过一个实习生,因为编写出来的软件由于时间性能问题而询问我是否换方案,从它的描述最终分析出他并不知道该组件为什么耗时,在我帮它调试定位到耗时超出预期的模块时他大吃一惊,原来这里写错了换种写法就可以了。

正文

在我优化一些系统性能时用到的方法总是很简单,先定位再优化,系统性能一般由少部分代码造成的,定位出来并优化它,更多的可以参考《编程珠玑》中性能那一章,它不只是一本教你编写算法的书籍。

下面简单分享几个我优化过项目的例子:

解释器组件优化

显然一开始在接受项目任务时,领导是会说解释器在解析某些指令时耗时超出预期范围,优化到指定的xxx毫秒范围内。如上所述 ,通过调试该指令的运行情况,定位每一个模块产生的耗时,最后定位出了解释器组件中一个for循环耗时超出预期。

关于for循环的优化,考虑到当时for循环执行次数不多并且系统的内存允许并且我们系统耦合性太高,并不适合大幅度改动,所以我通过编译器在编译器编译代码的时候将for循环展开,这样MCU流水线就不会被打断,耗时在预期的范围内。

通信协议校验算法优化

这其实是个简单的问题我不大想提,这是我目前工作的一家公司,他们在编写自定义通信协议校验算法采用的是通过计算的方式,其中在调用的接口上又重复调用了很多次导致耗时超出预期,后面我让他们换成查表的方式实现校验算法就将耗时优化到预期范围内。查表法是我比较经常应用的一个方法,不止在优化项目上,具体你可以看一下《代码大全》中对查表法那一章。其实你可以从很多开源的通讯协议项目源码中发现,像这类校验算法一般会提供空间与时间两种方案给你切换,查表法会占用一些空间但会快一些。

sqlite数据库插入操作性能优化

接到任务时领导说在插入大于xxx条记录时会出现好事几百ms的情况,需要优化到几十毫秒,一开始我还以为是事务没开起来,后面在定位耗时部分的时候,发现在执行sqlite查询时耗时太长了,于是研究了下sqlite的索引实现机制,后面验证了是查询条件索引太长导致耗时变长,将表的结构重新拆分就可以了。

总结

我所接触过的优化项目其实就是先定位后优化,而关于定位是很简单而又重要的,很多不知道的人会无从下手,定位的话你可以通过模块拆分再结合简单的折半查找基本上很快就能定位出差生性能问题部分的所在。

文章每周持续更新,原创虽短,确不容易,欢迎大家点赞关注,一起交流技术一起提升成长。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!