我正在寻找能够帮助我深入理解C++性能的资源(理想情况下是一本书).这是一个更多的背景:
我编写的服务器软件具有非常高的吞吐量要求和/或低延迟要求.我们用C++编写; 现在还没有真正进行辩论.我的大多数同事似乎对C++性能有了更好的理解.他们有更好的心理模型,因此他们可以判断某些代码何时会在规模上表现不佳.我缺乏这种理解,因此我希望改善我的心理模型.
我特别感兴趣的是:
我真的不感兴趣的事情:
作为一个起点,任何人都知道这本书,Efficient C++是否符合要求?
Igo*_*sky 27
让我将我的建议分成几个部分.
C++优化
作为一个起点,我强烈推荐Agner Fog的C++优化软件.本手册概述了常见的C++优化主题.
一般了解硬件
要拥有良好的C++性能心理模型,还需要了解底层硬件.请考虑以下声明:
a[7] = 5;
Run Code Online (Sandbox Code Playgroud)
在C++语言方面,代码行从性能角度来看很无聊:它只是一次内存写入.但是,在实际硬件上,内存写入的性能可能会有几个数量级的变化.要了解该级别的内容,您需要了解缓存,处理器管道,TLB,分支预测等概念.
作为处理器缓存的快速介绍,我推荐我的文章处理器缓存效果库.关于缓存和计算机内存的更深入和更长(> 100页)的讨论是每个程序员应该了解的内存.
为了全面了解现代计算机硬件,计算机体系结构:定量方法是通常推荐的书籍.我自己没有读过这本书,而是通过阅读博客和实验来学习.然而,其他人显然发现这本书非常有用.
了解特定处理器
在您提高优化技能的过程中,您会发现识别不同处理器的细节很有用.作为众多例子中的一个例子,不同的英特尔和AMD处理器对使用未对齐的SSE指令(例如_mm_storeu_ps C++内在函数)有着非常不同的惩罚.
为了了解不同处理器的细节,我建议使用Intel,AMD和VIA CPU的微体系结构:汇编程序员和编译器制造商的优化指南.事实上,我只是继续推荐Agner Fog的所有优化手册.此外,硬件供应商还提供其特定硬件的文档.
学习使用工具
在优化代码时,拥有良好的C++心理模型和硬件性能非常有用.但是,学习使用正确的工具至少同样有用.可以说,优化的最佳建议是"先测量!".仅仅通过考虑它就很难理解即使是简单的代码块的性能.通过运行代码并以各种方式测量它,您将获得大量信息.
这些是一些常见的有用测量:
我不会对特定工具提出建议,因为我可能会超出原始问题的范围.而且,工具本身就是一个很大的话题:不同硬件平台,软件平台和成本的工具各不相同(有些是免费的,有些是昂贵的).
但是,您当然需要注意,要优化C++代码,您需要了解并使用适当的工具.
guy*_*yrt 11
Valgrind应该是你的第一个工具.
Valgrind有很多工具,但cachegrind是一个很好的方法来查看你的算法是否具有良好的数据局部性.这将识别内存瓶颈.Callgrind是另一个valgrind模块,可以帮助您识别处理瓶颈.
参考文献:
Cachegrind:http: //valgrind.org/docs/manual/cg-manual.html
Callgrind:http: //valgrind.org/docs/manual/cl-manual.html