我试图找到开源分析器,而不是使用我必须支付 $$$ 的商业分析器之一。当我在 SourceForge 上进行搜索时,我发现了这四个我认为很有希望的 C++ 分析器:
- 闪亮:C++ 探查器
- 低脂肪轮廓仪
- 卢克·斯塔克沃克
- FreeProfiler
在了解我的程序性能方面,我不确定哪一个分析器最适合使用。很高兴听到一些建议。
您可以尝试Windows Performance Toolkit。完全免费使用。此博客条目 有一个如何进行基于样本的分析的示例。
有不止一种方法可以做到这一点。
大多数分析器假设您需要 1) 时间的高统计精度(大量样本),以及 2) 问题识别的低精度(函数和调用图)。
这些优先级可以颠倒。即问题可以定位到精确的机器地址,而成本精度是样本数量的函数。
大多数实际问题的成本至少为 10%,而高精度不是必需的。
示例:如果某件事使您的程序花费了应有的 2 倍,这意味着其中有一些代码花费了 50%。如果您在调用堆栈速度较慢的情况下对调用堆栈进行 10 个样本,则其中大约 5 个将出现精确的代码行。程序越大,问题就越有可能是堆栈中某处的函数调用。
我知道,这是违反直觉的。
注意:xPerf 几乎就在那里,但并不完全(据我所知)。它获取调用堆栈的样本并保存它们 - 这很好。这是我认为它需要的:
它应该只在您需要时采集样本。实际上,您必须过滤掉不相关的内容。
在堆栈视图中,它应该显示发生调用的特定行或地址,而不仅仅是整个函数。(也许它可以做到这一点,我无法从博客中看出。)
如果单击以获取以单个调用指令或叶指令为中心的蝶形视图,它应该显示的不是 CPU 分数,而是包含该指令的堆栈样本的分数。这将是对该指令成本的直接衡量,作为时间的一小部分。(也许它可以做到这一点,我不知道。)因此,例如,即使指令是对文件打开的调用或其他使线程空闲的指令,它仍然会花费挂钟时间,您需要知道那。
注意:我刚刚查看了 Luke Stackwalker,同样的评论也适用。我认为它在正确的轨道上,但需要 UI 工作。
补充:在更仔细地查看了 LukeStackwalker 之后,我担心它会成为测量功能比定位语句更重要的假设的牺牲品。因此,在调用堆栈的每个样本上,它都会更新函数级别的计时信息,但它对行号信息所做的只是跟踪每个函数中的最小和最大行号,它需要的样本越多,离得更远。所以它基本上丢掉了最重要的信息——行号信息。重要的原因是,如果您决定优化一个函数,您需要知道其中的哪些行需要工作,并且这些行在堆栈样本中(在它们被丢弃之前)。
有人可能会反对,如果保留行号信息,它将很快耗尽存储空间。两个答案。1) 样本上出现的线条只有这么多,而且它们反复出现。2) 不需要那么多样本——一直假设需要高统计精度的测量,但从未得到证明。
我怀疑其他堆栈采样器,例如 xPerf,也有类似的问题。
它不是开源的,但AMD CodeAnalyst是免费的。尽管名称如此,它也适用于 Intel CPU。有适用于 Windows(与 Visual Studio 集成)和 Linux 的版本。
从列出的那些人中,我发现 Luke Stackwalker 工作得最好——我喜欢它的 GUI,它很容易运行。
其他类似的是非常困- 类似的功能,采样似乎更可靠,GUI 可能有点难以使用(不是图形)。
在与他们相处一段时间后,我发现了一个非常重要的缺点。虽然两者都尝试以 1 毫秒的分辨率进行采样,但实际上它们并没有实现,因为它们的采样方法(附加进程的 StackWalk64)太慢了。对于我的应用程序,获取调用堆栈需要大约 5-20 毫秒。这不仅会使您的结果不精确,还会使它们产生偏差,因为较短的调用堆栈走得更快,因此往往会获得更多的命中。
我们使用LtProf并且对它很满意。不是开源的,但只有 $$,不是 $$$ :-)