了解C++性能的资源?

Nel*_*man 23 c++ performance

我正在寻找能够帮助我深入理解C++性能的资源(理想情况下是一本书).这是一个更多的背景:

我编写的服务器软件具有非常高的吞吐量要求和/或低延迟要求.我们用C++编写; 现在还没有真正进行辩论.我的大多数同事似乎对C++性能有了更好的理解.他们有更好的心理模型,因此他们可以判断某些代码何时会在规模上表现不佳.我缺乏这种理解,因此我希望改善我的心理模型.

我特别感兴趣的是:

  • 了解缓存效果,以及由于对象布局导致的缓存局部性如何影响我的代码性能.这是我团队其他成员似乎提出的头号问题.
  • 了解内存分配如何影响性能.我应该使用TCMalloc(或其他mallocs),我应该怎么知道?我应该如何调整各种分配和释放参数?
  • 我怎么知道对象复制的开销何时会很重要(例如,应该切换到指针)?
  • 我一般也对"优化"感兴趣,只要我知道何时使用它们.

我真的不感兴趣的事情:

  • "高性能计算"这一术语似乎表明了更多面向数学/模拟的应用程序.
  • 关于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