C++ 您最喜欢的C/C++;性能分析器/分析器?

C++ 您最喜欢的C/C++;性能分析器/分析器?,c++,performance,profiler,C++,Performance,Profiler,我正在尝试选择一个性能分析器来使用。我是一个初学者,不知道在性能分析器中应该寻找什么。最重要的特征是什么?两个经典答案(假设您在*nix世界中)是和。您需要(至少)检查每个过程或函数中花费的时间。如果您使用valgrind,我强烈建议您可视化性能瓶颈。 稳定性-能够在长时间内分析您的进程,而不会崩溃或耗尽内存。令人惊讶的是,有多少商业分析人士未能做到这一点 我希望在分析器中显示以下功能/输出信息。 1.)应能够显示消耗的总时钟周期以及每个功能的总时钟周期 2.)如果没有,则应说明每个功能消耗的总

我正在尝试选择一个性能分析器来使用。我是一个初学者,不知道在性能分析器中应该寻找什么。最重要的特征是什么?

两个经典答案(假设您在*nix世界中)是和。您需要(至少)检查每个过程或函数中花费的时间。

如果您使用
valgrind
,我强烈建议您可视化性能瓶颈。

  • 稳定性-能够在长时间内分析您的进程,而不会崩溃或耗尽内存。令人惊讶的是,有多少商业分析人士未能做到这一点

我希望在分析器中显示以下功能/输出信息。 1.)应能够显示消耗的总时钟周期以及每个功能的总时钟周期

2.)如果没有,则应说明每个功能消耗的总时间和花费的时间

3.)它应该能够告诉函数被调用了多少次

4.)最好知道内存读取、内存写入、缓存未命中、缓存命中

5.)每个功能的代码存储器

6.)使用的数据内存:全局常量、堆栈、堆使用情况


=AD

goldenmean说得对,我想补充一点,行执行计数有时也很方便。

您所需要的只是一个带有“暂停”按钮的调试器或IDE。它不仅是最简单、最便宜的工具,而且以我的经验,它是最好的

编辑,因为我想到了一个更好的答案:

另一方面,我在70年代学习人工智能,当时有一个非常流行的想法是自动编程,许多人都试图实现它。 (我试了一下。) 其想法是尝试自动化拥有领域知识结构以及所需功能需求的过程,以生成(和调试)能够满足这些需求的程序。 这将是编程领域自动推理的一次巡回演出。 有一些诱人的示威,但在实际意义上,这一领域并没有走得很远。 尽管如此,它还是为编程语言贡献了很多想法,比如契约和逻辑验证技术

为了构建一个理想的分析器,为了优化程序,它将每纳秒获取一个程序状态样本。 无论是在运行中还是以后(理想情况下,记得吗?),它都会仔细检查每个样本,看看在知道程序执行的原因后,特定的纳秒工作是否确实是必要的,或者是否可以以某种方式消除

这将是数十亿个样本和大量推理,但当然会有巨大的重复,因为任何浪费成本,比如说,10%的时间,都会在10%的样本上表现出来。 这种浪费可以在不到十亿个样本中识别出来。 如果事实上,100个甚至更少的样本可以发现它,只要它们是在时间上随机选择的,或者至少是在用户关心的时间间隔内随机选择的。 这是假设我们的目的是找到损耗,这样我们就可以消除它,而不是用很高的精度来测量它

为什么将所有这些推理能力应用于每个样本会有帮助? 好吧,如果程序很小,并且它只寻找O(n^2)代码之类的东西,那么它应该不会太难。 但是,假设程序的状态由20-30级的过程堆栈组成,可能有一些递归函数调用出现不止一次,可能有一些函数调用外部处理器来执行IO,可能程序的操作由表中的某些数据驱动。 然后,要确定特定样本是否浪费,需要潜在地检查所有或至少部分状态信息,并使用推理能力来确定在完成功能需求时是否确实有必要

探查器所要寻找的是纳秒被用于可疑的原因。 要了解花费它的原因,需要检查堆栈上的每个函数调用站点,以及围绕它的代码,或者至少检查其中的一些站点。 花费纳秒的必要性要求在堆栈上执行每个语句的逻辑和必要性。 只需要一个这样的函数调用站点就可以对整个示例进行可疑的对正。 因此,如果整个目的是为了发现纳秒被用于可疑的原因,那么样本越复杂越好, 每个样本的推理能力越强越好。 (这就是为什么较大的程序有更大的加速空间——它们有更深的堆栈,因此调用更多,因此更可能出现错误的调用。)

好的,那是在将来。 然而,由于我们不需要大量的样本(10或20个样本非常有用),而且我们已经有了高度智能的自动程序员(以比萨饼和苏打水为动力), 我们现在可以做了

将其与我们今天称之为分析器的工具进行比较。 他们中的佼佼者采集了堆栈样本,但他们的输出是什么? 测量。“热门路线”。鼠巢图。赏心悦目。 从这些方面来看,即使是人工智能的程序员也很容易忽略效率低下的问题,除了那些被输出暴露出来的问题。 在你修复了那些你确实找到的之后,那些你没有找到的就是那些让一切变得不同的东西


学习人工智能的一个方面是,如果人类原则上也做不到的话,不要期望能够编程让计算机做一些事情。

我更喜欢采样分析器而不是仪器分析器。分析器应该能够将样本数据映射回源代码,最好是在GUI中。我所知道的两个最好的例子是:

  • MacOSX:Shark
  • Linux:缩放

KCacheGrind中的比例调用图非常棒!看见