C++性能优化指南
这是一篇关于C++性能优化指南的学习笔记,主要是通过阅读学习Kurt Guntheroth著的Optimized C++:Proven Techniques for Heightened Performance。 这是一本知识量和信息量很大的一本书书,书里详细介绍了影响C++程序性能的原因,也给出了很多提高性能的优化策略。
书中不仅讲解了软件和系统方面的相关内容,还涉及了计算机的硬件组成的基础知识,使读者可以全面的了解计算机和程序设计。书中介绍的方法是具有通用性的,可以延伸至其他的编程语言,个人认为这是一本可以提升程序设计能力、感受到优化之美的一本值得一读的好书。
一、C++代码优化策略总结
1、用好的编译器并用好编译器(支持C++11的编译器,IntelC++(速度最快)、GNU的C++编译器GCC/G++(非常符合标准),Visual C++(性能折中),clang(最年轻Mac OS x))。
2、使用更好的算法。
3、使用更好的数据结构(不同的数据结构在使用内存管理器的方式也有所不同)。
4、使用更好的库(熟悉和掌握标准C++模板库对于进行性能优化的开发员是必须的技能,Boost Project 和 Google Code 公开了很多有用的库)。
5、减少内存分配和复制(减少对内存管理器的调用是一种非常有效的优化手段)。
6、优化内存管理(内存管理器的调度,丰富的API)。
7、移除计算(对于单条的C++语句进行优化)。
8、提高并发性(多个处理核心执行指令)。
二、影响优化的计算机行为
1、计算机的物理组成本身对计算机性能的限制。
2、计算机的主内存是比较慢的(通往主内存的接口是限制执行速度的瓶颈(冯*诺伊曼瓶颈),(摩尔定理)每年处理器的核心的数量都会增加,但是计算机的性能未必会提高,因为这些核心只是等待访问内存的机会(内存墙memory wall))。
3、计算机内存的访问方式(并非以字节为单位),某些内存访问会比其他的更慢(分为一级高速缓存(cache memory)、二级高速缓存、三级高速缓存、主内存、磁盘上的虚拟内存页)。
4、内存的容量是有限的,每个程序都会与其他程序竞争计算机资源,计算比做决定快。
5、在处理器中,访问内存的性能开销远比其他操作的性能开销大,非对齐访问所需要的时间是所有字节都在同一字节中的两倍。
6、访问频繁使用的内存地址的速度比访问非频繁使用的地址快,访问相邻地址的内存的速度比访问相互远隔的地址的内存块。
7、访问线程间共享的数据比访问非共享的数据资源慢很多。当并发线程共享数据时,同步代码降低了并发量。
8、有些语句隐藏了大量的计算,从语句的外表上看不出语句的性能开销会有多大。
三、性能测量
1、90/10规则:一个程序会花费90%的运行时去执行10%的代码。
2、只有正确且精确的测量才是准确的测量。
3、分辨率不是准确性。
4、在Windows上,clock()函数提供了可靠的毫秒级的时钟计时功能。在Windows8和之后的版本中,GetSystemTimePreciseAsfileTime()提供了亚微秒的计时功能。
5、计算一条C++语句对内存的读写次数,可以估算出一句C++ 语句的性能开销