一、前言
工作以来,接触的都是C++相关的项目,发现生产环境中的编程要求比自己写的Demo程序要高很多,主要有以下两点:
- 稳定(7x24正常服务)
- 高效(降低部署的机器资源,避免不必要的浪费)
写一个高效的程序并不是很容易,会涉及到程序用到的数据结构及底层编译器优化的细节知识。庆幸的是在这方面有不少资料,在此总结一下。【这里只列了提纲,等有时间再补编程实例】
二、优化技术
在《深入理解计算机系统》第5章 “优化程序性能”中,提到了编写高效程序主要有以下三点:
- 选择合适的算法及数据结构
- 写出编译器能够优化以转成高效可执行代码的源代码
- 针对具体硬件结构进行编程
这里分别对以上三点进行归纳的总结:
2.1 合适的算法及数据结构
设计、选择什么样的算法和数据结构,是由待解决的具体问题决定。
- 算法是基石,决定了时间复杂度的下限
- 在好的算法基础上,选择合适数据结构
这里归纳几个容易忽略的点:
(1)避免不必要的临时变量及计算
(2)减少内存引用
(3)使用STL容器(vector,unordered_map…)时, 预先分配内存
(4)减少系统调用的次数(如,我们应该避免频繁的使用new和delete,每次调用都会陷入内核态去分配、释放内存)
2.2 与编译器合作
这里归纳几点:
(1)使用inline,避免不必要的过程调用
(2)条件分支时,likely和unlikely的使用
2.3 充分发挥硬件的能力
这部分需要对计算机体系结构有一个清晰的了解,然后在具体写代码的时候,注意到什么样的写法可以充分发挥现有计算机体系结构的能力。
这里归纳几点:
(1)充分发挥指令集的能力,(如,在支持向量指令集的处理器上,考虑使用向量指令集)
(2)提高缓存命中率(一次缓存失败可能耗费几十倍的时钟去取相关的数据)
(3)提高处理器预测命中率(如likely和unlikely的使用)
(4)熟悉位运算指令,尽量使用位运算指令代替耗时运算(如/, % 等)
Reference
- 《提高C++性能的编程技术》
- 《C++性能优化指南》
- 《深入理解计算机系统》
- 《程序员的自我修养-链接,装载,库》