我正在尝试找到开源分析器,而不是使用我必须支付$$$的商业分析器之一。当我在SourceForge上进行搜索时,我遇到了这四个我认为非常有前途的C ++剖析器:
我不确定在了解我的程序性能方面哪一个分析器是最好的。听到一些建议会很棒。
答案 0 :(得分:6)
您可以尝试Windows Performance Toolkit。完全免费使用。这个blog entry有一个如何进行基于样本的分析的例子。
答案 1 :(得分:5)
答案 2 :(得分:3)
有多种方法可以做到。
Don't forget the no-profiler method.
大多数剖析器假设您需要1)高时序统计精度(大量样本),以及2)问题识别精度低(函数和调用图)。
这些优先事项可以逆转。即问题可以定位到精确的机器地址,而成本精度是样本数量的函数。
大多数真正的问题成本至少为10%,其中高精度并非必不可少。
示例:如果某些内容使您的程序需要2倍的时间,那么这意味着其中有一些代码需要花费50%。如果在缓慢的情况下取10个调用堆栈样本,则大约5个代码中将出现精确的代码行。程序越大,问题就越有可能是函数调用在堆栈中的某个位置。
这是反直觉的,我知道。
注意:xPerf几乎就在那里,但并不完全(据我所知)。它需要调用堆栈的样本并保存它们 - 这很好。这是我认为它需要的:
只应在需要时进行采样。事实上,你必须过滤掉那些不相关的东西。
在堆栈视图中,它应显示发生调用的特定行或地址,而不仅仅是整个函数。 (也许它可以做到这一点,我无法从博客中得知。)
如果单击以获取蝶形视图,以单个调用指令或叶指令为中心,它应该显示CPU分数,而不是包含该指令的堆栈样本的分数。这可以直接衡量该指令的成本,只是一小部分时间。 (也许它可以做到这一点,我无法分辨。) 因此,举例来说,即使一条指令是对文件打开的调用或其它让线程空闲的东西,它仍然会花费挂钟时间,你需要知道这一点。
注意:我只是看了看Luke Stackwalker,同样的评论也适用。我认为它是在正确的轨道上但需要UI工作。
补充:仔细查看LukeStackwalker后,我担心它会成为测量函数比定位语句更重要的假设的受害者。因此,在调用堆栈的每个示例中,它都会更新函数级别的时序信息,但是所有它与行号信息的关系都是跟踪每个函数中的最小和最大行号,这样,它所采用的样本越多,得到的距离越远。所以它基本上抛弃了最重要的信息 - 行号信息。重要的原因是,如果您决定优化一个函数,您需要知道它中哪些行需要工作,并且这些行在堆栈样本上(在它们被丢弃之前)。
有人可能会反对,如果保留行号信息,它将很快耗尽存储空间。两个答案。 1)样品上只有很多线条,它们会反复出现。 2)不需要那么多样本 - 假设一直需要高统计的测量精度,但这种假设从未被证明是合理的。
我怀疑其他堆栈采样器,如xPerf,也有类似的问题。
答案 3 :(得分:2)
它不是开源的,但AMD CodeAnalyst是免费的。尽管名称如此,它也适用于Intel CPU。有些版本可用于Windows(使用Visual Studio集成)和Linux。
答案 4 :(得分:2)
从已经列出的人那里,我发现Luke Stackwalker工作得最好 - 我喜欢它的GUI,它很容易运行。
其他类似的是Very Sleepy - 类似的功能,采样似乎更可靠,GUI可能更难使用(不是那个图形)。
在与他们共度更多时间之后,我发现了一个非常重要的缺点。虽然两者都尝试以1 ms的分辨率进行采样,但实际上他们并没有实现这一点,因为他们的采样方法(附加过程的StackWalk64)太慢了。对于我的应用程序,需要5-20毫秒才能获得一个callstack。这不仅会使你的结果变得不精确,而且会使它们偏斜,因为短的吟游诗人行走得更快,因此往往会获得更多的点击。
答案 5 :(得分:0)
我们使用LtProf并对此感到满意。不是开源,但只有$$,而不是$$$: - )