首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解C++性能的资源?

了解C++性能的资源?
EN

Stack Overflow用户
提问于 2012-09-10 17:17:08
回答 4查看 3.6K关注 0票数 24

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

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

我特别感兴趣的是:

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

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

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

作为一个起点,有人知道这本书,高效C++,是否符合这个标准?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-10 18:50:38

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

C++优化

作为一个起点,我强烈推荐Agner的C++中的优化软件。本手册很好地概述了常见的C++优化主题。

理解通用中的硬件

要有一个良好的C++性能心理模型,您还需要了解底层硬件。请考虑这一声明:

代码语言:javascript
复制
a[7] = 5;

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

作为对处理器缓存的快速介绍,我推荐我的文章处理器缓存效应库。关于缓存和计算机内存的更深入和更长的讨论(>100页)是每个程序员都应该知道关于内存的事情

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

理解特定处理器

在您提高优化技能的过程中,您会发现识别不同处理器的细节是有用的。作为许多例子中的一个,不同的英特尔和AMD处理器对于使用未对齐的SSE指令有非常不同的惩罚,例如_mm_storeu_ps C++内部指令。

为了了解不同处理器的具体情况,我建议使用Intel、AMD和VIA CPU的微体系结构:装配程序员和编译器制造商的优化指南。事实上,我将继续向您推荐来自Agner的所有优化手册。此外,硬件供应商还为他们的特定硬件提供文档。

学习使用工具

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

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

  • 计时:只需运行代码并测量时间
  • 取样剖面仪
  • 仪表剖面仪
  • 处理机计数器

我不会对具体的工具提出建议,因为我可以说是超出了你最初问题的范围。而且,工具本身也是一个很大的话题:不同的硬件平台、软件平台和成本(有些是免费的,有些是昂贵的),工具是不同的。

但是,您当然需要意识到,要优化C++代码,您需要知道并使用适当的工具。

票数 30
EN

Stack Overflow用户

发布于 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

票数 11
EN

Stack Overflow用户

发布于 2012-09-10 19:26:03

以前的回答给出了最重要的想法。

只有一个警告:做一些分析(英勇),这是你会得到快速的胜利。之后,尝试获得缓存优化,查看SSE…将需要更多的努力,因为(至少在刚开始的时候)没有什么改进。

而且,C++是一种巨大的语言,编译器具有神奇的功能。模板、内联等允许编译器执行在其他语言(如C. )中不可能实现的优化,因此在考虑使用低级别数据结构时要非常小心。这可能会导致性能的损失(以及内存管理中更多的bug和更多的麻烦)。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12356495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档