- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
程序优化的5个方向要点,户型优化的要点,优化发展环境工作要点,网站列表页优化要点,网站结构优化的要点,标题优化有那几个要点,golang1.6的优化方向,golang1.7的优化方向,地理综合题方向及要点,领导班子优化方向
程序优化的5个方向
80/20法则:程序执行中,80%的时间消耗在20%的代码上。
优化前,我们首先得找到这20%的关键路径;
各种语言都有专门的工具来找到这20%的关键路径,比如C++经常用到的gprof;
参考? HYPERLINK /me115/archive/2013/06/05/3117967.html 《C++的性能优化实践》
在关键路径上对耗时的计算进行优化;
主要的优化方向为:
减少重复计算、预先计算、延后计算、降低计算代价、不计算;
减少重复计算
典型的例子如缓存,将之前相同的计算(查数据库,读写文件)存下来,等待下一次继续使用;适用场景:计算结果有有效期,过段时间后需要再次计算;
预先计算
对于关键路径中比较耗时的计算,预先计算出来,节省每次计算的成本;
预先计算出对照表关键路径中需要用到的映射关系对照表,将对照表预先计算,在关键路径中直接取用;
将计算提前到初始化期间比???,内存分配耗时,将其提前到初始化的时间分配,建立内存池;
将计算提前到编译期间
比如:使用常量表达式,在编译期间将最终值计算出来,节省这部分的运行时开销;
相关技术:模版元编程;
适用场景:计算出来的值一直有效,无需再次计算;
延迟计算
将计算耗时延迟到后期,这样,对于异常情况或其它分支情况,在中途就转换,不用再计算;
有较多分支条件将最耗时的计算延后,这样,可能很多场景在中途就转到其它分支上,不用计算;
判断条件中的技巧:a||b ab如果判断条件比较耗时,将更耗时的放在后面计算;这样,对于a||b,当a成立时,b就不用再计算了;延迟计算的好处在于可能可以不用计算;
适用场景:分支条件场景;
降低计算代价
这是通常能想到的最直接的优化手段,如何能够直接降低计算的代价;
- 内存申请从堆上改为栈上
动态内存分配昂贵,将内存分配从堆上改为栈上;
降低灵活性,使用自定制版本的函数代替库函数;
使用更低级的指令或语言改写;
在C++中嵌入汇编语言;
使用SSE2等指令集;
使用更优的算法或数据结构;
操作STL容器时,STL中的算法一般比自己手写的算法要高效,尽量使用STL的算法来替换我们的手写算法;
参考:
HYPERLINK /me115/p/4605211.html 《STL区间成员函数及区间算法总结》
HYPERLINK /me115/p/4596543.html 《高效的使用STL》
适用场景:这类优化一般是以降低代码可读性为代价的(STL的除外),用于优化的最后阶段;
不计算
优化的终极方案,不计算;
业务发现用不到的业务逻辑,废弃的业务逻辑,仍然存在关键路径中的还在执行的;痛快的删除它;
却掉临时对象开销
在我们的代码中,可能会有些临时对象是不知不觉的,而消除临时对象,将节省这部分开销;
参考:? HYPERLINK /me115/p/4707169.html 《消除临时对象》
以上是单线程关键路径的优化,接下来,我们聊聊扩展到多核,在多线程上的优化;
HYPERLINK /me115/p/4726228.html 当优化扩展到多核时
内容目录:
HYPERLINK /me115/p/4726228.html \l h20 任务分解的粒度
HYPERLINK /me115/p/4726228.html \l h21 数据竞争
HYPERLINK /me115/p/4726228.html \l h22 引入锁
HYPERLINK /me115/p/4726228.html \l h23 惊群现象
HYPERLINK /me115/p/4726228.html \l h24 数据复制
HYPERLINK /me115/p/4726228.html \l h25 数据分片
当优化扩展到多核时
软件开发没有银弹,我们能做的就是选择和平衡;
上一篇文章我们聊了在单线程下程序优化的5个方向(ref: HYPERLINK /me115/p/4707251.html 《程序优化的5个方向》);当单核优化到极值后,就到了多任务的情况;?想起来很清晰,单个任务分解成多个任务,让多个cpu同时来工作,并行执行,效率自然就上去了;?但,未必就这么简单;
任务分解的粒度
首先,我们需要确定,我们的单个任务是否可以分解;比如解析很多个文件,这样的任务划分成多个很简单;但如果是一个耗时的串行逻辑计算,后期的计算依赖前期的结果,这样就不好拆分;这种形式可能需要在更高层次上来拆分;
数据竞争
编程就是计算和数据;计算并行了,但数据还是访问同一份,访问共同的资源会产生资源竞争;?如果不进行控制,可能导致同一份数据重复计算(多个读的场景)或是脏数据的产生(有回写的场景
文档评论(0)