C++性能榨汁机之虚函数的开销

虚函数的实现虽然C++标准并没有规定编译器实现虚函数的方式,但是大部分编译器均是采用了虚函数表来实现虚函数,即对于每一个包含虚成员函数的类生成一个虚函数表,一个指向虚函数表的指针被放在对象的首地址(不考虑多继承等复杂情况),虚函数表中存储该类所有的虚函数地址。当使用引用或者指针调用虚函数时,首先通过虚函数表指针找到虚函数表,然后通过偏移量找到虚函数地址并调用。关于虚函数表的更多细节,建议阅读《深度
Continue reading

C++性能榨汁机之指针与引用

前言C语言的指针让我们有了直接操控内存的强大能力,同时指针也是使用C语言时最容易出问题的地方。C++在继承了C语言的指针的同时又给我们提供了另外一个武器:引用。今天我们来探讨一下指针与引用的异同以及两者之间的性能差异。 指针与引用的区别引用与指针的区别也算是C++中老生常谈的话题了,无论是在期末考试的试卷上还是找工作时的笔试面试上,这个问题都是“常客”。对于这个问题更加详细的解答请参考《More
Continue reading

C++性能榨汁机之switch语句的背后

前言几乎每本面向初学者的C语言或C++书籍在前面两章都会提到分支控制语句if……else和switch……case,在某些情况下这两种分支控制语句可以互相替换,但却很少有人去深究在if……else和switch……case语句的背后到底有什么异同?应该选择哪一个语句才能使得效率最高?要回答这些问题,只能走到switch语句的背后,看看这些语句到底是怎么实现的。 if语句与switch语句相信学过C
Continue reading

日常踩坑:一把亲手写出的死锁

前言在C++多线程程序的开发过程中,资源的互斥访问是第一个要考虑的问题,常用的方法就是使用互斥锁对共享数据进行保护,而使用锁最大的风险就是有可能产生死锁,导致程序异常退出。因为这个风险的存在,所以我每次使用互斥锁的时候都小心翼翼,看互斥锁lock之后是否在合适的地方进行了unlock,在多个互斥锁同时使用的时候反复检查加锁的顺序是否会导致死锁……但是,百密一疏,自己还是亲手写出了一把死锁,导致付出
Continue reading

C++性能榨汁机之无锁编程

前言私以为个人的技术水平应该是一个螺旋式上升的过程:先从书本去了解一个大概,然后在实践中加深对相关知识的理解,遇到问题后再次回到书本,然后继续实践……接触C++并发编程已经一年多,从慢慢啃《C++并发编程实战》这本书开始,不停在期货高频交易软件的开发实践中去理解、运用、优化多线程相关技术。多线程知识的学习也是先从最基本的线程建立、互斥锁、条件变量到更高级的线程安全数据结构、线程池等等技术,当然在项
Continue reading

C++性能榨汁机之惊群问题

一个小场景在开始正式讨论我们的问题之前,我们先想象这么一个小场景: 场景1:6只小鸟停在电线上休息,都在等待食物。 场景2:我们向鸟群投放一条小虫,作为它们的食物。 场景3:6只小鸟看到有食物到来,都停止休息,一起飞起来去抢夺食物。 场景4:最终只有一只小鸟(bird4)能够吃到食物,其他小鸟无奈而又伤心的回到电线上继续休息。 何谓惊群问题?上面我们的小场景实际就是一个现实中的惊群问题,明
Continue reading

C++性能榨汁机之局部性原理

前言《CSAPP》讲到了局部性原理:一个编写良好的计算机程序常常具有良好的局部性(loacality)。也就是说,它们倾向于引用邻近于其他最近引用过的数据项,或者最近引用过的数据项本身。这种倾向性,被称为局部性原理(principle of locality),是一个持久的概念,对硬件和软件系统的设计和性能都有着极大的影响。 局部性原理代码示例为了让大家更加直观的感受到局部性原理对我们程序性能的影
Continue reading

日常踩坑:一场C++实现KMP算法引发的"血案"

问题背景  KMP算法是一种优化后的字符串匹配算法,可以将复杂度由暴力匹配的O(m*n)降低到O(m+n),具体原理就不再赘述,相信几乎任何一本算法书上面都会有KMP算法的详细介绍与实现。以前虽然学习过KMP算法,也清楚算法的原理,但是却从来没有完整实现过一次,闲来无事便打开Visual Studio准备使用C++独立实现一下。   代码如下: 12345678910111213141516171
Continue reading

C++性能榨汁机之伪共享

前言  在多核并发编程中,如果将互斥锁的争用比作“性能杀手”的话,那么伪共享则相当于“性能刺客”。“杀手”与“刺客”的区别在于杀手是可见的,遇到杀手时我们可以选择战斗、逃跑、绕路、求饶等多种手段去应付,但“刺客”却不同,“刺客”永远隐藏在暗处,伺机给你致命一击,防不胜防。具体到我们的并发编程中,遇到锁争用影响并发性能情况时,我们可以采取多种措施(如缩短临界区,原子操作等等)去提高程序性能,但是伪共
Continue reading

C++性能榨汁机之循环展开

什么是循环展开?循环展开,英文中称(Loop unwinding或loop unrolling),是一种牺牲程序的尺寸来加快程序的执行速度的优化方法。可以由程序员完成,也可由编译器自动优化完成。循环展开最常用来降低循环开销,为具有多个功能单元的处理器提供指令级并行。也有利于指令流水线的调度。 循环展开对程序性能的影响我们直接以实际代码向大家展示循环展开的作用,首先看未经过循环展开优化的代码: 12
Continue reading

Root lee

沉默是金


Programmer


HangZhou