c++性能优化(cpu篇)

背景

1.做性能优化时,其实也是存在二八定律的,基本上80% 的性能损耗是由20%的代码引起的,而且这20%的代码被基本上被调用的频率非常高。因此一些比较简单的优化就能显著提高性能;

2.在写好代码之后再考虑性能优化的事,否则会出现代码难以读懂,抽象依赖细节等各种问题。另外过早的优化可能没有想象的那么有用,原因参考第一条;

3.在资源不是很紧张的情况下,程序员的生产力的提高比性能的优化更重要。这也是为啥python流行的一个原因吧;

4.很有优化都是在做时间和空间的权衡,考虑哪个更重要,然后决定优化思路;

5.良好的代码风格,代码结构能有效提高代码的性能;

6.优化是有限度的,代码的可读性与可维护性非常重要。

工具

liunx下一般使用gprof,windows下一般使用vs自带的vsperfmon.exe。具体如何使用就不介绍了,参考文章很多。

优化方法

以下介绍的只是我平常使用到的手段,肯定还有很多方法我不知道,希望能有机会学到更多。懒得写代码验证,能找到资料的就直接使用外部资料了。

1.在内存资源不紧张的情况下,使用查表法或者判断可以提高函数运行速度,有兴趣可以看switch的汇编实现。

        查表是典型的空间换时间,通过大部分情况下将提前计算好的结果硬编入代码,从而只需要耗费比较的时间就能获取需要通过计算才能得到的结构。

        另外对完整表比较大,耗费内存特别多的情况,可以设置部分表,提高计算速度。比如对于电话号码的编码与寻址,将前3或4位作为区号先做一层表,能将查询速度降低3到4个数量级。

2.在操作内存时,要考虑高速缓冲行失效的问题。

        What is “cache-friendly” code?

3.尽量使用编译器内建的函数。

        编译器内置的函数,一般都是做过优化的,所以一般性能会比较高,比如 __builtin_popcount 

4.尽量减少大内存对象的构造与析构,可以考虑缓存暂时不用的对象,等待后续继续使用。

        这个很好理解,就不举例了,实际上就相当于自己建了一个cache。

5.减少不必要的函数调用。使用inline,减少继承层级等。但是记住,这样的优化是有限度的,否则代码会很难懂。

        普通的call指令包括

            1)推参与函数返回地址入栈;

            2)跳转;

            3)保存esp与分配栈帧;

            4)平衡堆栈并跳到返回地址。

       从上述可以看书,call指令会多执行很多汇编指令。

6.考虑到cpu的指令预测功能,在Linux下使用likely,unlikely宏。要把最容易出现的分支情况放在最前面。

        Why is it faster to process a sorted array than an unsorted array?

7.数据存放时需要考虑对齐问题。除非内存紧张或者涉及IPC的情况,一般不用强制对齐。

        对齐情况下,CPU寻址的速度会快很多。

8.优化锁的使用,能用原子操作的就不用锁。能用应用层同步手段的,就不要使用内核对象同步。

        1)原子操作相对锁来说,速度会快很多。在windows中,CRITICAL_SECTION在可用的情况下,wait函数是不会进入内核的,避免了模式切换,提高了性能。

        2)对程序员来说,锁的使用绝对是一个很大的话题。在使用锁时需要注意:只有在必须使用锁时才使用锁;锁住需要锁的区域,不要锁无关的代码区域;锁中最好不要做 IO 等耗时长的操作,尽早退出。

9.优化判断条件,减少循环次数。

        找到循环的最小次数,明确各类边界条件,情况不对,直接跳出。

10.优化内存使用,内存块频繁的申请与释放耗时比较大,必要情况下可以自己实现内存管理。

        对于内存大小比较相近,频繁申请时可以自己缓冲内存列表,类似 Look aside list。

11.使用c++11右值语义,减少分配与释放临时缓冲区。

        c++ 11 move类构造函数相信看过的都很有印象,在对象存在大内存的情况下尤其有用。

12.使用构造函数初始化对象,而不是赋值语句。

        c++入门书籍的知识。

13.谨慎使用轮循或者sleep,能用事件通知的情况下,非必要不用考虑轮循。

        这个相信大家都明白。

14.充分利用多核优势,拆分非串行化业务。

15.减少非必要的线程创建,节省系统资源与切换造成的性能损耗。

16.将非必要业务从UI线程中挪出,提高界面响应速度,提高用户体验。

17.重构,优化代码结构。将变化源或者算法封装,将代码结构厘清之后,可能优化的效果会好于上述所有的手段。

        良好的代码结构能让程序员有效察觉耗时多的代码区块。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354