您最喜欢的C / C ++性能分析器/分析器的功能是什么?

时间:2008-12-04 19:01:28

标签: c++ performance profiler

我正在尝试选择要使用的性能分析器。我是初学者,并不确定在性能分析器中寻找什么。最重要的功能是什么?

7 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

2.如果不是一个,应该告诉每个功能消耗的总时间和花费的时间。

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

4。)知道内存读取,内存写入,缓存未命中,缓存命中都会很好。

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

6。)使用的数据存储器:全局常量,堆栈,堆使用。

= AD

答案 2 :(得分:1)

两个经典答案(假设你在* nix世界中)是valgrindgprof。你想要的东西可以让你(至少)检查你在每个程序或功能中花费多少时间。

答案 3 :(得分:1)

  • 稳定性 - 能够长时间分析您的进程,而不会崩溃或内存不足。令人惊讶的是,有多少商业概况失败了。

答案 4 :(得分:0)

goldenmean说的没错,我会补充说,行执行计数有时也很方便。

答案 5 :(得分:0)

您只需要一个具有“暂停”按钮的调试器或IDE。它不仅是最简单,最便宜的工具,而且根据我的经验,它是最好的。 This is a complete explanation why. Note the 2nd-to-last comment.

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

顺便说一句,我研究过A.I.在70年代,一个很好的想法是自动编程,并且许多人试图完成它。 (我抓住了它。) 我们的想法是尝试自动化拥有域的知识结构以及所需的功能需求的过程,以生成(和调试)可以实现这些要求的程序。 这将是关于编程领域的自动推理中的一个游览力量。 有一些诱人的示威活动,但从实际意义上说,这个领域并没有走得太远。 尽管如此,它确实为编程语言提供了很多想法,比如合同和逻辑验证技术。

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

这将是数十亿的样本和大量的推理,但当然会有巨大的重复,因为任何浪费成本,比如10%的时间,将在10%的样本上显而易见。 这种浪费可以在少于10亿个样本上得到认可。 事实上,100个样本甚至更少样本可以发现它,只要它们是及时随机选择的,或者至少在用户关心的时间间隔内。 这是假设目的是找到浪费,这样我们就可以摆脱它,而不是精确地测量它。

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

探查器正在寻找的是由于可疑原因而花费的纳秒数。 要查看它被占用的原因,需要检查堆栈上的每个函数调用站点,以及它周围的代码,或者至少其中一些站点。 耗费纳秒的必要性需要逻辑AND,即在堆栈上执行每个语句的必要性。 它只需要一个这样的函数调用站点就可能有一个可疑的理由让整个样本有一个可疑的理由。 因此,如果整个目的是找到纳秒被用于可疑的原因,样本越复杂越好, 每个样本的推理能力越强,就越好。 (这就是为什么更大的程序有更多的加速空间 - 他们有更深的堆栈,因此更多的呼叫,因此更有可能是不合理的呼叫。)

好的,这是将来的。 但是,因为我们不需要大量的样本(10或20非常有用),并且因为我们已经拥有高度智能的自动编程器(由比萨饼和苏打水驱动), 我们现在可以这样做。

将其与我们今天称为分析器的工具进行比较。 他们中最优秀的是采集堆栈样本,但它们的输出是什么? 测量。 “热门路径”。大鼠的巢图。秀色可餐。 从那些人那里,即使是人工智能的程序员也很容易错过很大的低效率,除了这些输出所暴露的那些。 在你修复了你找到的那些之后,那些你找不到的那些就是那些能够发挥重要作用的那些。

学习A.I.的其中一件事。是的,如果一个人原则上不能做到这一点,不要指望能够对计算机进行编程。

答案 6 :(得分:0)

我倾向于采样分析器而不是仪器化分析器。分析器应该能够将样本数据映射回源代码,理想情况是在GUI中。我所知道的两个最好的例子是: