推荐开源分析器

我试图find开源分析器,而不是使用其中一个商业分析器,我必须支付$$$。 当我在SourceForge上进行search时,遇到了四种我认为很有希望的C ++分析器:

  1. shiny:C ++分析器
  2. 低脂分析器
  3. 卢克Stackwalker
  4. FreeProfiler

我不确定哪一个分析人员是学习我的程序性能的最佳人选。 听到一些build议会很好。

您可以尝试Windows性能工具包 。 完全免费使用。 这个博客条目有一个如何做基于样本的分析的例子。

  • Valgrind (和相关的工具,如cachegrind等)
  • Google性能工具

有不止一种方法来做到这一点。

不要忘记没有配置文件的方法。

大多数分析人员假设您需要1)时间统计精度高(大量样本),2)问题识别(函数和调用图)精度低。

这些优先事项可以扭转。 即问题可以定位到精确的机器地址,而成本精度是样本数量的函数。

大多数真正的问题成本至少10%,其中高精度不是必需的。

例如:如果有什么东西让你的程序花了两倍的时间,那就意味着它里面有一些代码花费了50%。 如果您在缓慢调取10个调用堆栈样本时,其中大约5个会出现代码的精确行数。 程序越大,问题出现在堆栈中的某个函数调用的可能性就越大。

我知道这是反直觉的。

注:xPerf几乎在那里,但不完全(据我所知)。 它需要调用堆栈的样本并保存 – 这很好。 这是我认为需要的:

  • 它只应该当你想要他们采样。 事实上,你必须过滤出不相关的东西。

  • 在堆栈视图中,它应该显示特定的线路或地址,而不仅仅是整个功能。 (也许它可以做到这一点,我不能从博客中知道)

  • 如果单击获取以单个调用指令或叶子指令为中心的蝶形视图,它应该不会显示CPU分数,而是显示包含该指令的堆栈样本的一部分。 这只是一个时间的一小部分,直接衡量教学费用。 (也许它可以做到这一点,我不知道。)所以,例如,即使一个指令是一个文件打开或其他闲置线程的调用,它仍然花费时间,你需要知道那。

注:我只是看着卢克Stackwalker,同样的言论适用。 我认为这是正确的轨道,但需要UI工作。

补充:仔细看过LukeStackwalker,恐怕它是衡量函数比定位语句更重要的假设的牺牲品。 因此,在每个调用堆栈样本中,它会更新函数级别的定时信息,但是所有与行号信息相关的信息都会跟踪每个函数中的最小和最大行数,这样取得的样本就越多更远离那些得到。 所以它基本上抛弃了最重要的信息 – 行号信息。 原因很重要的是,如果你决定优化一个函数,你需要知道哪些行需要工作,这些行是否在堆栈样本上(在被丢弃之前)。

有人可能会反对,如果行号信息被保留下来,它会很快耗尽存储空间。 两个答案。 1)样品上只出现很多线条,反复出现。 2)不需要太多的样本 – 假定测量的统计精度很高是必须的,但是从来没有这样做。

我怀疑其他堆栈采样器,如xPerf,也有类似的问题。

这不是开源的,但是AMD CodeAnalyst是免费的。 尽管名称也适用于Intel CPU。 有Windows版本(与Visual Studio集成)和Linux版本。

从列出的人中,我发现Luke Stackwalker工作得最好 – 我喜欢它的GUI,很容易跑。

其他类似的是Very Sleepy – 类似的功能,抽样似乎更可靠,GUI可能有点难以使用(不是图形)。


花了一些时间和他们在一起后,我发现一个相当重要的缺点。 虽然两者都试图以1毫秒的分辨率进行采样,但实际上他们并没有达到这个目的,因为他们的采样方法(附加过程的StackWalk64)太慢了。 对于我的应用程序,需要5-20毫秒的时间才能获得一个调用堆栈。 这不仅会让你的结果不精确,而且会使得它们倾斜,因为短的堆叠走得更快,因此往往会得到更多的命中。

我们使用LtProf并对此感到满意。 不是开源的,但只有$$,不是$$$ 🙂