老大总结的代码级提高代码执行效率需要注意的点,很值得和大家分享一下,在这儿也由衷地感谢下老大的总结和工作中的指导。大多数的点都在项目中验证过,比如对配置文件的遍历操作可以通过偏移量查找的方式优化,也有一些是常识,但可能并未引起大家注意,比如函数返回值不能是对象,必须是引用等。
- 保证你的算法是否足够优化。在代码里经常要做的事情之一是匹配查找,比如查找本次请求对应的server IP地址、查找某个物品的属性值等等。查找算法里边有很多,最笨的是遍历,接下来有hash、红黑树等等,而最快的是按偏移量查找。常用的做法是通过数据结构设计的配合,尽量使用偏移量查找的方法。
- 函数返回的时候不要返回一个对象,这是C++编程里效率杀手,同时存在浅拷贝的问题。
- 函数的参数也不要是一个对象,这个做法同样是效率杀手,同时也存在浅拷贝的问题。
- 要尽量避免字符串操作,比如拼装字符串、字符串匹配、字符串查找等。字符串操作也是效率杀手。在数据结构设计上多花些信息,尽量让数据类型是整型。
- 尽量避免浮点运算,这也是效率杀手。在我们的应用场景里,很少是非要浮点型不可得。
- 虽然我们必须要纪录log,以便查找定位问题。但这并不代表可以随便打log,打log也是要消耗cpu的。不做不是必须要做的事情,是保证程序效率一个重要思想。
- 如果没有必要,尽量不做网络交互。网络交互会导致进程等待,这个等待时间对于cpu运算速度来讲实在是太漫长了。
- 对于配置文件解析,在程序初始化的时候只作一次就好了,千万不要把它放到程序的主循环里。配置文件变更频率很低,没必要每次都去读取。
- 所有的系统调用都是效率杀手。不要因为看起来只有一行代码就认为效率很高,每个系统调用的背后都是一个复杂的实现,而且系统调用要进行数据从用户态到内核态,再从内核态到用户太的数据拷贝。
- 尽量减少内存拷贝,内存拷贝也是比较耗cpu的。
- 对于时间准确性要求不高的地方,可以在每次请求开始的时候取一次当前时间记录下来,然后在整个会话里复用这个值。因为取时间的系统调用通常格外消耗cpu,所以能省则省。
- 千万不要把只需要初始化一次的操作放到程序的主循环里反复初始化。