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
构造函数存储开始标记,析构函数计算经过的时间并将其添加到映射中:
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/