Performance Do(采样)剖面仪“仍然”;“谎言”;这些天?

Performance Do(采样)剖面仪“仍然”;“谎言”;这些天?,performance,profiling,performance-testing,sampling,gprof,Performance,Profiling,Performance Testing,Sampling,Gprof,我在评测本机代码方面的大部分有限经验都是在GPU上,而不是在CPU上,但我在未来会看到一些CPU评测 现在,我刚刚读了这篇博文: 关于探查器如何测量以及它们向您显示了什么,如果您对区分不同的调用路径和在其中花费的时间感兴趣,那么这可能不是您所期望的 我的问题是:今天(5年后)是否仍然如此?也就是说,采样探查器(即那些不会严重降低执行速度的探查器)是否仍像gprof过去那样工作(或者在没有的情况下调用grind--separate callers=N)?或者现在的探查器在采样时习惯性地记录整个调

我在评测本机代码方面的大部分有限经验都是在GPU上,而不是在CPU上,但我在未来会看到一些CPU评测

现在,我刚刚读了这篇博文:

关于探查器如何测量以及它们向您显示了什么,如果您对区分不同的调用路径和在其中花费的时间感兴趣,那么这可能不是您所期望的


我的问题是:今天(5年后)是否仍然如此?也就是说,采样探查器(即那些不会严重降低执行速度的探查器)是否仍像gprof过去那样工作(或者在没有
的情况下调用grind--separate callers=N
)?或者现在的探查器在采样时习惯性地记录整个调用堆栈吗

关于gprof,是的,今天仍然如此。这是为了保持分析开销小而设计的。从最新版本开始:

调用图中的一些数字是估计值,例如 调用方和子例程中的子时间值和所有时间数字 台词

剖面图中没有关于这些测量的直接信息 数据本身。相反,gprof通过做出假设来估计它们 关于你的程序,这可能是真的,也可能不是真的

所做的假设是,每次调用任何 函数foo与调用foo的人无关。如果foo使用5 总共几秒钟,对foo的调用中有2/5来自a,然后是foo 假设为a的孩子们贡献2秒的时间


关于KCacheGrind,自文章撰写以来几乎没有什么变化。您可以查看,并看到最新版本于2013年4月5日发布,其中包括不相关的更改。你也可以参考Josef Weidendorfer在文章中的评论(Josef是KCacheGrind的首席执行官)

如果你注意到了,我在你引用的那篇文章中发表了几条评论,但这不仅仅是剖析器给了你不好的信息,而是人们在性能实际是什么的问题上自欺欺人

你的目标是什么?是为了找出如何使程序尽可能快吗?或者是为了测量各种功能所花费的时间,希望这将导致?(提示-它没有。)

举例说明:例如,您可以在某个地方调用一个看起来很无辜的小函数,该函数恰好调用了九码系统代码,包括读取.dll来提取字符串资源以将其国际化。这可能会占用50%的挂钟时间,因此会占用50%的挂钟时间。“CPU档案器”会给你看吗?不,因为几乎所有的50%都在做I/O。您需要许多堆栈样本才能知道精确到小数点后3位的时间吗?当然不是。如果你只得到10个样品,那就有5个,给或拿。一旦你知道小小的例行公事是个大问题,那是否意味着你因为别人写的而走运?如果你知道它在看什么样的线呢?它真的需要国际化吗?如此之多以至于你愿意为此付出两倍的速度?当你真正的问题是定性地理解什么需要时间时,你看到测量是多么无用吗


我可以继续举这样的例子……

不,许多现代采样分析器都没有显示关于gprof的问题

事实上,即使在编写时,具体的问题实际上更像是
gprof
混合使用插装和采样,然后尝试基于有限的呼叫者/被呼叫者信息重构假想的调用图,并将其与采样的定时信息相结合

现代采样探查器,如
perf
、VTune和各种特定于语言的探查器(针对不编译为本机代码的语言),可以捕获每个样本的完整调用堆栈,从而提供有关该问题的准确时间。或者,您可以在不收集调用堆栈的情况下进行采样(这大大降低了采样成本),然后在没有任何仍然准确的调用方/被调用方信息的情况下呈现信息

即使在过去,这在很大程度上也是正确的,所以我认为可以公平地说,作为一个群体,采样分析器从未真正表现出这个问题


当然,剖析者仍然可以通过各种方式撒谎。例如,要使结果精确到指令级别是一个非常棘手的问题,因为现代CPU一次运行100条指令,可能跨越许多功能,而且复杂的性能模型中,指令的上下文成本可能与其标称延迟和吞吐量值非常不同。即使是那些棘手的问题也可以通过“硬件辅助”来解决,例如在最近的x86芯片上,具有和更高版本相关的功能,可以帮助您以一种不太偏颇的方式锁定指令。

所以,我加上你的答案,因为它回答了我的问题,但这很糟糕。@einpoklum你可能想看看。特别是AMD的CodeXL和英特尔的VTune放大器XE。还有许多来自微软的工具。我使用过这些工具,并且对它们非常满意。你网站上的例子在我描述的意义上更好吗?他们是采样分析器吗?@einpoklum是的。它们都支持基于采样的分析。然而,在某些情况下,可以使用仪器。我在VTune上写了一篇文章,并计划在不久的将来在Visual Studio内置分析器上写一篇类似的文章。这里的问题是gprof和KCacheGrind非常旧,没有定期维护。但我提到的那些仍在维护中,它们更先进。这就是我使用它们的原因。然而,在大多数采样分析器中,这种设计不是标准的,甚至不是常见的。典型的采样分析可能会捕获样本上的整个调用堆栈(
perf
does,如果您要求的话)