80/20法则:程序执行中,80%的时间消耗在20%的代码上。
优化前,咱们首先得找到这20%的关键路径;
各类语言都有专门的工具来找到这20%的关键路径,好比C++常常用到的gprof;html
参考《C++的性能优化实践》git
在关键路径上对耗时的计算进行优化;
主要的优化方向为:
减小重复计算、预先计算、延后计算、下降计算代价、不计算;github
典型的例子如缓存,将以前相同的计算(查数据库,读写文件)存下来,等待下一次继续使用;
适用场景:计算结果有有效期,过段时间后须要再次计算;算法
对于关键路径中比较耗时的计算,预先计算出来,节省每次计算的成本;数据库
预先计算出对照表
关键路径中须要用到的映射关系对照表,将对照表预先计算,在关键路径中直接取用;编程
将计算提早到初始化期间
好比,内存分配耗时,将其提早到初始化的时间分配,创建内存池;缓存
将计算提早到编译期间
好比:使用常量表达式,在编译期间将最终值计算出来,节省这部分的运行时开销;
相关技术:模版元编程;性能优化
适用场景:计算出来的值一直有效,无需再次计算;数据结构
将计算耗时延迟到后期,这样,对于异常状况或其它分支状况,在中途就转换,不用再计算;多线程
有较多分支条件
将最耗时的计算延后,这样,可能不少场景在中途就转到其它分支上,不用计算;
判断条件中的技巧:a||b a&&b
若是判断条件比较耗时,将更耗时的放在后面计算;这样,对于a||b,当a成立时,b就不用再计算了;延迟计算的好处在于可能能够不用计算;
适用场景:分支条件场景;
这是一般能想到的最直接的优化手段,如何可以直接下降计算的代价;
- 内存申请从堆上改成栈上
动态内存分配昂贵,将内存分配从堆上改成栈上;
下降灵活性,使用自定制版本的函数代替库函数;
使用更低级的指令或语言改写;
在C++中嵌入汇编语言;
使用SSE2等指令集;
使用更优的算法或数据结构;
操做STL容器时,STL中的算法通常比本身手写的算法要高效,尽可能使用STL的算法来替换咱们的手写算法;
参考:
《STL区间成员函数及区间算法总结》
《高效的使用STL》
适用场景:这类优化通常是以下降代码可读性为代价的(STL的除外),用于优化的最后阶段;
优化的终极方案,不计算;
业务发现
用不到的业务逻辑,废弃的业务逻辑,仍然存在关键路径中的还在执行的;痛快的删除它;
却掉临时对象开销
在咱们的代码中,可能会有些临时对象是不知不觉的,而消除临时对象,将节省这部分开销;
参考:《消除临时对象》
以上是单线程关键路径的优化,接下来,咱们聊聊扩展到多核,在多线程上的优化;
若是你以为本文对你有所帮助,请点击如下【推荐】按钮, 让更多人阅读;
Posted by: 大CC | 06AUG,2015
博客:blog.me115.com [订阅]
Github:大CC