什么是你最喜欢的分析工具(对于C ++)
到目前为止,我只使用了Rational Quantify。 我已经听说了关于英特尔的VTune的伟大的事情,但从来没有尝试过!
编辑:我主要是寻找软件,将仪器的代码,因为我猜这是唯一的方法来获得非常好的结果。
也可以看看:
Windows上的本地C ++有哪些好的分析器?
对于linux开发(尽pipe其中一些工具可能在其他平台上工作)。 这些是我所知道的两个大牌,还有很多其他的小牌在一段时间内没有看到积极的发展。
- Valgrind的
- TAU – debugging和分析工具
对于Linux: Google Perftools
- 比valgrind更快(但不是很细腻)
- 不需要代码检测
- 不错的graphics输出( – > kcachegrind)
- 内存分析,CPU分析,泄漏检查
我唯一的经验分析C + +代码与AQTime由AutomatedQA(现在的SmartBear软件)。 它有几种内置的性能分析器(性能,内存,Windows句柄,exception跟踪,静态分析等等),并testing代码以获得结果。
我很喜欢使用它 – find那些代码的小改动可以显着改善性能的地方总是很有趣。
过去,我广泛使用了Glowcode,除此之外没有什么好的经验。 它的Visual Studio集成非常好,它是我使用过的最有效/直观的分析器(甚至与托pipe代码的分析器相比)。
显然,如果你没有在Windows上运行,那就没用了,但这个问题让我不清楚你的要求是什么。
Visual Studio 2008中的分析器非常好:快速,用户友好,清晰并且集成在IDE中。
恕我直言, 使用debugging器进行采样是最好的方法。 所有你需要的是一个IDE或debugging器,让你暂停程序。 在你安装好profiler之前,它会指出你的性能问题。
我以前从来没有做过分析。 昨天我用一个静态时间表(一个地图<std :: string,long long>)编写了一个ProfilingTimer类来存储时间。
构造函数存储起始点,并且析构函数计算已用时间并将其添加到地图中:
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); }
在我想要configuration文件的每个函数(或{块})中,我需要添加:
ProfilingTimer _ProfilingTimer("identifier");
由于我必须猜测哪些函数需要花费很多时间,因此添加所有我想要描述的函数是非常麻烦的。 但它运行良好,打印function显示消耗的时间以%为单位。
(是否有其他人正在使用类似的“自制轮廓”?或者它只是愚蠢的?但它很有趣!有没有人有改善build议?
是否有某种自动添加一行到所有函数?)
毫无疑问, 它简单,可靠,干的工作,并可以给各种不错的数据细分。
对于Windows,请查看Xperf 。 它使用采样的configuration文件,有一些有用的用户界面,&不需要仪器。 对于追踪性能问题非常有用。 你可以回答如下问题:
- 谁使用最多的CPU? 使用调用堆栈深入到函数名称。
- 谁分配最多的内存?
- 谁在做最多的registry查询?
- 磁盘写入? 等等
当你发现瓶颈时,你会感到非常惊讶,因为它们可能不在你预期的地方!
分析有不同的要求。 检测代码是否正常,还是需要configuration优化的代码(甚至是已编译好的代码)? 你需要逐行的个人资料信息吗? 你正在运行哪个操作系统? 你还需要configuration共享库吗? 跟踪到系统调用是什么?
就我个人而言,我使用oprofile来处理所有事情,但这可能不是每种情况下的最佳select。 Vtune和鲨鱼都很好。
既然你没有提到你正在使用的平台,我会在Linux下说cachegrind。 当然。 它是Valgrind工具集的一部分。
http://valgrind.org/info/tools.html
我从来没有使用它的子functionCallgrind,因为我的代码优化大部分是内部function。
请注意,有一个前端KCachegrind可用。
对于Windows开发,我一直使用软件validation的性能validation器 – 它速度快,合理准确,价格合理。 最好的是,它可以testing正在运行的进程,并允许您在运行时打开和closures数据收集,无论是手动和基于callstack – 非常适合分析较大程序的一小部分。
我使用devpartner作为个人电脑平台。
我已经尝试了量化一个AQTime,量化赢得了,因为它的重点是“子树”和“删除子树”的function。
唯一敏感的答案是英特尔的PTU 。 当然,最好在英特尔处理器上使用它,并至less在C2D机器上获得更有价值的结果,因为架构本身更容易回馈有意义的configuration文件。
我已经在Windows和Linux下使用VTune很多年了,效果很好。 后来的版本变得更糟了,当他们把这个产品外包给俄罗斯开发团队时,质量和性能都下降了(VTune崩溃增加了,通常需要15分钟以上才能打开一个分析文件)。
关于仪器,你可能会发现它比你想象的要less。 在我工作的那种应用程序中,添加工具通常会使产品速度下降,以至于无法正常工作(真实故事:启动应用程序,回家,第二天回来,应用程序仍在初始化)。 而且,使用非仪器化分析可以对现场问题做出反应。 例如,使用VTune远程date采集器,我可以启动一个采样会话,针对带有数百个同时连接的实时服务器,这些连接正在经历性能问题,并捕获在生产中发生的,我永远无法在testing环境中复制的问题。
对于Windows,我已经尝试了AMD Codeanalyst,Intel VTune和Visual Studio Team Edition中的分析器。
Codeanalyst是越野车(经常崩溃),并在我的代码,其结果往往是不准确的。 它的UI是不直观的。 例如,要访问configuration文件结果中的调用堆栈显示,必须单击“进程”选项卡,然后单击程序的EXE文件名,然后单击带有小写字母“CSS”的工具栏button。 但是它是免费的,所以你可以尝试一下,而且它没有AMD处理器就可以工作(function更less)。
VTune(700美元)有一个可怕的用户界面国际海事组织; 在一个大的程序中,很难find你想要的特定的调用树,而且你一次只能看一个程序中的一个“节点”(一个带有直接调用者和被调用者的函数) – 你看不到一个完整的呼叫树。 有一个调用图的视图,但我找不到一个方法来使相对执行时间出现在图上。 换句话说,图表中的函数看起来是一样的,不pipe在这些函数中花了多less时间 – 就好像他们完全错过了剖析的要点。
Visual Studio的分析器具有三者中最好的GUI,但由于某些原因,它无法从我的大部分代码中收集示例(仅在我的整个C ++程序中收集了几个函数的示例)。 另外,我找不到一个价格或方式直接购买; 但它附带了我公司的MSDN订阅。 Visual Studio支持托pipe,本机和混合代码; 在这方面,我不太确定其他两名分析师。
总之,我还不知道一个好的分析器! 我一定会看看这里的其他build议。
ElectricFence很适合用于mallocdebugging
我最喜欢的工具是Easy Profiler: http : //code.google.com/p/easyprofiler/
这是一个编译时分析器:必须使用一组例程手动对源代码进行检测,以便描述目标区域。 但是,一旦运行应用程序并自动将测量结果写入XML文件,只需要打开Observer应用程序,只需点击几下分析/比较工具即可在定性图表中查看结果。
在Windows下的Visual Studio 2010分析器。 VTune有一个很棒的调用graphics工具,但是从Windows Vista / 7开始就已经崩溃了。 我不知道他们是否修好了。
让我给EQATEC一个插件…就是我正在寻找的东西…简单的学习和使用,并给我的信息,我需要迅速find热点。 我更喜欢它内置到Visual Studio中的一个(尽pipe我还没有尝试VS 2010,但要公平)。
拍摄快照的能力很大。 我经常得到一个额外的分析和优化,而等待真正的目标分析运行…爱它。
哦,它的基本版本是免费的!
http://www.eqatec.com/Profiler/