关于性能:你最喜欢的剖析工具(C++)

What's your favorite profiling tool (for C++)

到目前为止,我只使用了有理量化。我听说过英特尔的vtune很棒,但从未尝试过!

编辑:我主要在寻找能够检测代码的软件,因为我想这是获得非常好结果的唯一方法。

参见:

在Windows上有什么好的本地C++分析器?


对于Linux开发(尽管其中一些工具可能在其他平台上工作)。这是我所知道的两个大公司,还有很多其他的小公司已经有一段时间没有看到积极的发展。

  • 瓦尔格林德
  • tau-调优和分析实用程序


Linux:谷歌性能工具

  • 比Valgrind更快(然而,粒度不是很细)
  • 不需要代码检测
  • 良好的图形输出(-->kcachegrind)
  • 内存分析、CPU分析、泄漏检查

imho,使用调试器进行采样是最好的方法。您所需要的只是一个允许您停止程序的IDE或调试器。它会在安装分析器之前修复性能问题。


我分析C++代码的唯一经验是AutomatedQA的AQTIME(现在是Stigabror软件)。它内置了几种类型的分析器(性能、内存、Windows句柄、异常跟踪、静态分析等),并插入代码以获得结果。

我喜欢使用它——找到那些代码的微小变化可以显著提高性能的地方总是很有趣的。


我以前从来没有做过侧写。昨天我用一个静态时间表(map)为时间存储编程了一个profilingtimer类。

构造函数存储开始标记,析构函数计算经过的时间并将其添加到映射中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ProfilingTimer::ProfilingTimer(std::string name)
 : mLocalName(name)
{
 sNestedName += mLocalName;
 sNestedName +=">";

 if(sTimetable.find(sNestedName) == sTimetable.end())
  sTimetable[sNestedName] = 0;

 mStartTick = Platform::GetTimerTicks();
}

ProfilingTimer::~ProfilingTimer()
{
 long long totalTicks = Platform::GetTimerTicks() - mStartTick;

 sTimetable[sNestedName] += totalTicks;

 sNestedName.erase(sNestedName.length() - mLocalName.length() - 3);
}

在我想要分析的每个函数(或块)中,我需要添加:

1
ProfilingTimer _ProfilingTimer("identifier");

这一行有点繁琐,要添加我想要分析的所有函数,因为我必须猜测哪些函数需要花费很多时间。但它工作得很好,打印功能显示消耗的时间百分比。

(是否有其他人使用类似的"自制资料"?或者只是愚蠢?但是很有趣!有人有改进建议吗?

是否有某种类型的自动向所有函数添加行?)


我在过去广泛使用glowcode,除了对它有积极的经验外,什么都没有。它的Visual Studio集成非常好,它是我使用过的最高效/最直观的分析器(甚至与托管代码的分析器相比)。

显然,如果您不在Windows上运行,这是没用的,但问题是,我不清楚您的具体要求是什么。


Visual Studio 2008中的探查器非常好:速度快、用户友好、清晰,并且集成在IDE中。


毫无疑问,Oprofile是一款简单、可靠的产品,它可以完成这项工作,并且可以提供各种不错的数据分类。


对于Windows,请查看xperf。它使用采样配置文件,具有一些有用的用户界面,不需要检测。对于跟踪性能问题非常有用。您可以回答以下问题:

  • 谁使用的CPU最多?使用调用堆栈向下钻取函数名。
  • 谁分配的内存最多?
  • 谁在执行最多的注册表查询?
  • 磁盘写入?等。

当你发现瓶颈时,你会非常惊讶,因为它们可能不是你期望的地方!


对于Windows开发,我一直在使用软件验证的性能验证器——它速度快、相当准确、价格合理。最好的是,它可以检测一个正在运行的进程,并允许您在运行时打开和关闭数据收集,既可以手动进行,也可以基于调用堆栈-这对于分析较大程序的一小部分非常有用。


分析有不同的要求。检测代码是否正常,或者您是否需要分析优化的代码(甚至已经编译的代码)?您需要逐行配置文件信息吗?你在运行哪个操作系统?您还需要分析共享库吗?跟踪系统调用怎么样?

就我个人而言,我做的每件事都使用Oprofile,但这可能不是每种情况下的最佳选择。vtune和shark都很出色。


既然你没有提到你正在使用的平台,我会说在Linux下的cachegrind。一定地。它是Valgrind工具集的一部分。

网址:http://valgrind.org/info/tools.html

我从未使用过它的子特性callgrind,因为我的大多数代码优化都是针对内部函数的。

请注意,有一个前端kcachegrind可用。


我在PC平台上使用devpartner。


唯一敏感的答案是来自英特尔的PTU。当然,最好在英特尔处理器上使用它,至少在C2D机器上获得更有价值的结果,因为体系结构本身更容易返回有意义的配置文件。


我试过量化一个aqtime,因为它的"关注子树"和"删除子树"功能非常宝贵,所以量化获胜。


对于Windows,我在Visual Studio Team Edition中尝试过AMD代码分析员、英特尔vtune和分析器。

代码分析师有缺陷(经常崩溃),在我的代码中,它的结果常常是不准确的。它的用户界面是非结构化的。例如,要达到配置文件结果中的调用堆栈显示,您必须单击"进程"选项卡,然后单击程序的exe文件名,然后单击工具栏按钮,上面有小字母"css"。但是它是免费的,所以你也可以尝试一下,它在没有AMD处理器的情况下工作(功能更少)。

vtune($700)有一个糟糕的用户界面imo;在一个大型程序中,很难找到您想要的特定调用树,而且一次只能查看程序中的一个"节点"(一个具有直接调用方和调用方的函数),而不能查看完整的调用树。有一个调用图视图,但我找不到一种方法使相对执行时间显示在图上。换句话说,不管花了多少时间,图中的函数看起来都是一样的——就好像它们完全错过了分析的要点。

VisualStudio的探查器具有三的最佳GUI,但由于某种原因,它无法从我的大多数代码中收集样本(仅在我的整个C++程序中收集了几个函数的样本)。另外,我也找不到直接购买的价格或方式;但它与我公司的msdn订阅一起提供。Visual Studio支持托管代码、本机代码和混合代码;在这方面,我不确定其他两个分析程序。

总之,我还不知道一个好的剖析者!我一定要看看这里的其他建议。


电气围栏可以很好地用于malloc调试


我在Windows和Linux下使用了很多年的vtune,效果非常好。后来的版本变得更糟,当他们将该产品外包给他们的俄罗斯开发人员时,质量和性能都下降了(增加的"vtune崩溃",通常需要15分钟以上的时间来打开分析文件)。

关于仪器,你可能会发现它不如你想象的有用。在我所开发的应用程序中,添加仪器通常会使产品速度变慢,以至于不再工作(真实情况是:启动应用程序,回家,第二天回来,应用程序仍在初始化)。此外,使用非检测分析,您可以对实际问题作出反应。例如,使用"vtune remote date collector",我可以在有数百个同时出现性能问题的实时服务器上启动采样会话,并捕获在生产环境中发生的问题,这些问题是我无法在测试环境中复制的。


我最喜欢的工具是EasyProfiler:http://code.google.com/p/easy profiler/

它是一个编译时分析器:源代码必须使用一组例程手动检测,以便描述目标区域。但是,一旦应用程序运行并自动将度量值写入XML文件,只需打开观察者应用程序并在分析/比较工具上单击几次,然后才能在定性图表中看到结果。


Windows下的Visual Studio 2010探查器。vtune有一个很棒的调用图工具,但从Windows Vista/7开始就坏了。我不知道他们是否修好了。


让我给eqatec插个插头…我只是在寻找…简单的学习和使用,并给我的信息,我需要快速找到热点。我更喜欢它内置于Visual Studio(尽管我还没有尝试过vs 2010,公平地说)。

拍摄快照的能力是巨大的。我经常在等待真正的目标分析运行的同时完成额外的分析和优化…喜欢它。

哦,它的基本版本是免费的!http://www.eqatec.com/profiler/