C++由于本身就是一门相对于其他语言来说更接近机器的语言,因此对于其语言本身没有什么优化的空间。那么对于一个C++应用的优化思路可以从以下几个方面进行入手。

尽管C++语言本身无法进行太多的优化,不过C++是需要经过编译器编译成机器代码,才可以生成可执行的程序。因此选择一款正确的编译器并正确的设置编译选项,便是实现C++高性能的第一步。比方对与CLang而言,其在linux平台的编译效率就要高于gcc。

其次需要根据业务场景选择正确的库函数,或是对库函数按照业务场景进行优化,比方说,如果当前的业务场景只是在单线程下运行,那么就不需要用到库函数处理多线程逻辑的那一部分,那么比方说,对于内存管理那部分,我们可以override其new 函数。以移除其在多线程情况下的内存分配。而在逻辑处理的部分,也可以移除相关的并行处理的部分。在比方说,对于数据的排序上面,上学那会儿,各种帖子上都说快速排序怎么怎么好,但在实际开发中,排序算法的选择需要综合具体情况进行考虑,比方对于STL sort算法的实现,数据量大时采用Quick Sort, 分段递归排序,一旦分段后的数据量小于某个门槛,为避免Quick Sort的递归调用带来过大的额外负荷(overhead),就改用insertion sort,如果递归层次过深,还会改用Heap Sort。

我们不可能针对所有的代码都进行优化,我们需要找到性能的瓶颈,根据2-8原则,即程序80%的时间是花费在20%的代码上,因此如何正确的识别出20%的代码才是在实际的开发场景中最优先考虑的事情。在实际的操作中,可以使用gprof来识别出时间都花费在哪些函数上,在这些函数中,哪些函数是因为频繁调用而产生的时间消耗,考虑是否可以将其改造成inline,而哪些函数单次执行而耗费很多的时间,考虑是否可以将函数中耗费时间的部分进行优化,比方说缓存中间变量(动态规划的思路),采用并行的方法进行处理,或将耗费时间的部分交给云端服务器进行处理。

在对于具体的函数进行优化的时候,需要找到其性能热点。(x86的机器可以采用vtune查看cputime和汇编指令所花费的时间)
image.png

根据业务场景进行定制化的系统设计,尽量将系统进行充分的解耦,针对不同的场景,调用不同的模块,减少不必要的模块去占用系统的时间,比方一个简单的业务需要,可能不需要庞大的log system或是复杂的concurrency。所以尽管我们有很多技巧可以提升代码的速度,但相比较糟糕的系统设计而带来的性能损失,这些技巧也仅是杯水车薪。这部分的提升,更多的依赖的项目经验,以及对于业务的理解,可能无法在短时间内速成。

最后一点,在代码的实际开发过程中,需要针对不同的平台进行定制化的开发,比方对于Nvida的CPU,在处理流媒体的时候,我们可以使用其Nvida提供的toolkit,使用其EGL Stream,充分释放CPU的性能。所以个人感觉开发一套高性能的代码用于不同的平台,本身就存在一定程度上的矛盾。

Reference

https://zhuanlan.zhihu.com/p/33638344