我正在寻找能帮助我深入了解C++性能的资源(理想情况下是一本书)。以下是更多的背景:
我编写的服务器软件具有非常高的吞吐量要求和/或低延迟需求。我们用C++写文章,这个时候并不是真正的辩论。我的大多数同事似乎对C++性能有了更好的理解。他们有更好的心理模型,因此他们可以判断出某一段代码何时会在规模上表现不佳。我缺乏这种理解,所以我希望改进我的心理模型。
我特别感兴趣的是:
我并不真正感兴趣的事情:
作为一个起点,有人知道这本书,高效C++,是否符合这个标准?
发布于 2012-09-10 18:50:38
让我把我的建议分成几个部分。
C++优化
作为一个起点,我强烈推荐Agner的C++中的优化软件。本手册很好地概述了常见的C++优化主题。
理解通用中的硬件
要有一个良好的C++性能心理模型,您还需要了解底层硬件。请考虑这一声明:
a[7] = 5;在C++语言方面,从性能角度看,代码行很枯燥:它只是一个内存写入。但是,在实际硬件上,内存写入的性能可能会有数量级的变化。要了解在这个级别上发生了什么,您需要了解缓存、处理器管道、TLB、分支预测等概念。
作为对处理器缓存的快速介绍,我推荐我的文章处理器缓存效应库。关于缓存和计算机内存的更深入和更长的讨论(>100页)是每个程序员都应该知道关于内存的事情。
为了全面了解现代计算机硬件,“计算机体系结构:定量方法”是一本普遍推荐的书。我没有亲自读这本书,而是通过阅读博客和实验学到的。然而,其他人显然发现这本书非常有用。
理解特定处理器
在您提高优化技能的过程中,您会发现识别不同处理器的细节是有用的。作为许多例子中的一个,不同的英特尔和AMD处理器对于使用未对齐的SSE指令有非常不同的惩罚,例如_mm_storeu_ps C++内部指令。
为了了解不同处理器的具体情况,我建议使用Intel、AMD和VIA CPU的微体系结构:装配程序员和编译器制造商的优化指南。事实上,我将继续向您推荐来自Agner的所有优化手册。此外,硬件供应商还为他们的特定硬件提供文档。
学习使用工具
在优化代码时,有一个良好的C++模型和硬件性能是非常有用的。但是,学习使用正确的工具至少也同样有用。可以说,优化的最佳建议是“先测量!”。仅仅考虑一下简单的代码块,就很难理解它的性能。通过运行代码并以各种方式度量代码,您将获得大量信息。
以下是一些常见的有用的测量方法:
我不会对具体的工具提出建议,因为我可以说是超出了你最初问题的范围。而且,工具本身也是一个很大的话题:不同的硬件平台、软件平台和成本(有些是免费的,有些是昂贵的),工具是不同的。
但是,您当然需要意识到,要优化C++代码,您需要知道并使用适当的工具。
发布于 2012-09-10 17:24:38
瓦兰应该是你的第一个工具。
Valgrind有很多工具,但是cache差使是查看算法是否具有良好的数据局部性的一个很好的方法。这将识别内存瓶颈。Call差事是另一个帮助您识别处理瓶颈的val差制模块。
参考文献:
卡什研:http://valgrind.org/docs/manual/cg-manual.html
考勤:http://valgrind.org/docs/manual/cl-manual.html
发布于 2012-09-10 19:26:03
以前的回答给出了最重要的想法。
只有一个警告:做一些分析(英勇),这是你会得到快速的胜利。之后,尝试获得缓存优化,查看SSE…将需要更多的努力,因为(至少在刚开始的时候)没有什么改进。
而且,C++是一种巨大的语言,编译器具有神奇的功能。模板、内联等允许编译器执行在其他语言(如C. )中不可能实现的优化,因此在考虑使用低级别数据结构时要非常小心。这可能会导致性能的损失(以及内存管理中更多的bug和更多的麻烦)。
使用STL和BOOST可能有助于避免一些错误。
https://stackoverflow.com/questions/12356495
复制相似问题