了解C+的资源+;演出 我正在寻找资源(最好是一本书),这将有助于我深入理解C++的性能。这里有更多的背景:

了解C+的资源+;演出 我正在寻找资源(最好是一本书),这将有助于我深入理解C++的性能。这里有更多的背景:,c++,performance,C++,Performance,我编写具有极高吞吐量要求和/或低延迟要求的服务器软件。我们用C++编写;现在还没有真正的辩论。我的大多数同事似乎对C++的性能有了更好的理解。他们有更好的心智模型,因此他们可以判断某个代码何时会在规模上表现不佳。我缺乏这种理解,因此我希望改进我的思维模式 我特别感兴趣的是: 了解缓存效果,以及对象布局导致的缓存局部性如何影响代码的性能。这是我团队其他成员似乎提出的首要问题 了解内存分配如何影响性能。我应该使用TCMalloc(或其他malloc)吗?我怎么知道?我应该如何调整各种分配和解除分配

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

我特别感兴趣的是:

  • 了解缓存效果,以及对象布局导致的缓存局部性如何影响代码的性能。这是我团队其他成员似乎提出的首要问题
  • 了解内存分配如何影响性能。我应该使用TCMalloc(或其他malloc)吗?我怎么知道?我应该如何调整各种分配和解除分配参数
  • 我如何知道对象复制的开销何时起作用(因此应该切换到指针,例如)
  • 我也对“优化”感兴趣,只要我知道何时使用它们
我并不真正感兴趣的事情:

  • “高性能计算”,这个术语似乎表示更多面向数学/模拟的应用
  • 讨论C++相对于其他语言的性能,因为我被C++ + ./LI>所困扰。

作为起点,有人知道这本书是否符合要求吗?

Valgrind应该是你的第一个工具

Valgrind有很多工具,但是cachegrind是一个很好的方法来查看您的算法是否具有良好的数据局部性。这将识别内存瓶颈。Callgrind是另一个valgrind模块,它将帮助您识别处理瓶颈

参考资料:

Cachegrind:

Callgrind:
让我把我的建议分成几个部分

C++优化

作为起点,我强烈推荐Agner Fog。本手册对常见的C++优化主题给出了很好的概述。 全面了解硬件

<> P>为了拥有C++性能的良好心智模型,还需要了解底层硬件。请考虑这个陈述:

a[7] = 5;
<>在C++语言方面,代码行从性能的角度来看是无聊的:它只是一个内存写。但是,在实际硬件上,内存写入的性能可能会有数量级的变化。要了解该级别的情况,您需要了解缓存、处理器管道、TLB、分支预测等概念

作为对处理器缓存的快速介绍,我推荐我的文章。关于缓存和计算机内存的更深入、更长(>100页)的讨论正在进行中

为了全面了解现代计算机硬件,《计算机体系结构:定量方法》是一本普遍推荐的书。我自己没有读这本书,而是通过阅读博客和实验来学习。然而,其他人显然发现这本书非常有用

了解特定处理器

在提高优化技能的过程中,您会发现识别不同处理器的细节非常有用。作为许多例子,不同的英特尔和AMD处理器对使用未对齐SSE指令有很大的惩罚,例如,μMyStuuLuPS++ C++。 要了解不同处理器的具体情况,我推荐。事实上,我将继续推荐Agner Fog的所有产品。此外,硬件供应商还提供其特定硬件的文档

学习使用工具

<> P>具有良好的C++心智模型和硬件性能,在优化代码时非常有用。但是,学习使用正确的工具至少同样有用。可以说,最佳的优化建议是“测量优先!”。仅仅通过思考,就很难理解哪怕是一个简单代码块的性能。通过运行代码并以各种方式对其进行度量,您将获得大量信息

以下是一些常见的有用测量值:

  • 计时:只需运行代码并测量时间
  • 采样剖面仪
  • 仪器剖面仪
  • 处理器计数器
我不会讨论关于特定工具的建议,因为我可能已经超出了您最初问题的范围。而且,工具本身就是一个大话题:工具因不同的硬件平台、软件平台和成本而异(有些是免费的,有些是昂贵的)


<>但是,你必须意识到,优化C++代码需要知道并使用适当的工具。

以前的回答给出了最重要的想法。 只有一个警告:做一些分析(valgrind),这是你会很快获得胜利的地方。之后,尝试缓存优化,查看SSE…将需要更多的努力,因为(至少在开始时)几乎没有什么改进

< C++也是一种巨大的语言,编译器也有魔力。模板、内联等允许编译器进行其他语言(如C)无法实现的优化。 因此,在考虑使用低级数据结构时要非常小心。这可能会导致性能损失(以及内存管理中的更多错误和头痛)

使用STL和BOOST可能有助于避免一些错误

要了解该级别的情况,您需要了解缓存、处理器管道、TLB、分支预测等概念

我想以非常随意的方式进一步讨论这些问题

  • 缓存-基本上,如果您可以尝试适合您的