c++ - 了解 C++ 性能的资源?

标签 c++ performance

我正在寻找可以帮助我深入了解 C++ 性能的资源(最好是一本书)。这里有一点背景:

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

我特别感兴趣:

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

我并不真正感兴趣的事情:

  • “高性能计算”这个术语似乎表示更多面向数学/模拟的应用程序。
  • 讨论 C++ 相对于其他语言的性能,因为我坚持使用 C++。

作为起点,任何人都知道这本书,Efficient C++ ,是否符合要求?

最佳答案

让我把我的建议分成几个部分。

C++ 优化

作为起点,我强烈推荐 Agner Fog 的 Optimizing software in C++ .本手册对常见的 C++ 优化主题进行了很好的概述。

了解一般硬件

要对 C++ 性能有一个良好的心智模型,您还需要了解底层硬件。考虑一下这个说法:

a[7] = 5;

在 C++ 语言方面,从性能的角度来看,这行代码很无聊:它只是一次内存写入。但是,在真实硬件上,内存写入的性能可能会相差几个数量级。要了解该级别发生了什么,您需要了解缓存、处理器管道、TLB、分支预测等概念。

作为对处理器缓存的快速介绍,我推荐我的文章 Gallery of Processor Cache Effects .关于缓存和计算机内存的更深入和更长(>100 页)的讨论是 What Every Programmer Should Know About Memory .

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

了解特定处理器

在您提高优化技能的过程中,您会发现识别不同处理器的细节很有用。作为众多示例之一,不同的 Intel 和 AMD 处理器对使用未对齐的 SSE 指令(例如 _mm_storeu_ps C++ 内在函数)有非常不同的惩罚。

要了解不同处理器的细节,我建议 The microarchitecture of Intel, AMD and VIA CPUs: An optimization guide for assembly programmers and compiler makers .事实上,我只是继续推荐所有 optimization manuals来自阿格纳雾。此外,硬件供应商会为其特定硬件提供文档。

学习使用工具

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

这些是一些常见的有用度量:

  • 计时:只需运行代码并测量时间
  • 采样分析器
  • 仪器分析器
  • 处理器计数器

我不会就特定工具提出建议,因为我可能超出了您最初问题的范围。而且,工具本身就是一个大话题:工具因硬件平台、软件平台和成本而异(有些是免费的,有些很昂贵)。

但是,您当然需要知道,要优化 C++ 代码,您需要了解和使用适当的工具。

关于c++ - 了解 C++ 性能的资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12356495/

相关文章:

c - 一个大文件还是多个小文件?

performance - 空内核上的 CUDA 与 OpenCL 性能

c++ - opencv 项目中的 CMakeLists.txt 出错

c++ - 不一致的完全限定枚举编译时行为

c++ - utf8 等效项显示不正确

python - ctypes中的编译器依赖

sql - "NOT IN"在SQL查询中的性能

javascript - 在 html 中加载 javascript 的理想位置在哪里?

android - 数组索引查找与实例字段查找

c++ - 查找指向gdb中某个地址的所有变量