到目前为止,我只使用过Rational Quantify。我听说过有关英特尔VTune的好消息,但从未尝试过它!
编辑:我主要是在寻找可以检测代码的软件,因为我猜这是获得非常好结果的唯一方法。
答案 0 :(得分:34)
用于Linux开发(尽管其中一些工具可能适用于其他平台)。这些是我所知道的两个大牌,还有很多其他较小的名字在一段时间内没有积极发展。
答案 1 :(得分:26)
对于Linux: Google Perftools
答案 2 :(得分:8)
恕我直言,sampling using a debugger是最好的方法。您只需要一个IDE或调试器,它可以让您暂停程序。在您安装了探查器之前,它会解决您的性能问题。
答案 3 :(得分:7)
我唯一使用AutomatedQA(现为SmartBear Software)的AQTime来分析C ++代码。它内置了几种类型的分析器(性能,内存,Windows句柄,异常跟踪,静态分析等),并使用代码来获取结果。
我很喜欢使用它 - 找到代码中的一些小改变可以显着改善性能的那些地方总是很有趣。
答案 4 :(得分:5)
我过去曾广泛使用过Glowcode,并且只有积极的经验。它的Visual Studio集成非常好,它是我曾经使用过的最有效/直观的分析器(甚至与托管代码的分析器相比)。
显然,如果你没有在Windows上运行,那就毫无用处了,但是这个问题让我不清楚你的要求是什么。
答案 5 :(得分:5)
我以前从未做过分析。昨天我编写了一个ProfilingTimer类,其中包含一个静态时间表(一个map< std :: string,long long>)用于时间存储。
构造函数存储起始刻度,析构函数计算经过的时间并将其添加到地图中:
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);
}
在我要配置的每个功能(或{block})中,我需要添加:
ProfilingTimer _ProfilingTimer("identifier");
添加我想要分析的所有函数这一行有点麻烦,因为我必须猜测哪些函数需要花费很多时间。但它运作良好,打印功能以%表示消耗时间。
(是否有其他人使用任何类似的“自制简介”?或者它只是愚蠢?但它很有趣!有人有改进建议吗?
是否有某种自动向所有功能添加线路?)
答案 6 :(得分:5)
Visual Studio 2008 中的分析器非常好:快速,用户友好,清晰且集成在IDE中。
答案 7 :(得分:4)
答案 8 :(得分:4)
对于Windows,请查看Xperf。它使用采样的配置文件,有一些有用的UI,&不需要仪器。对于跟踪性能问题非常有用。您可以回答以下问题:
当您发现瓶颈时,您会感到非常惊讶,因为它们可能不在您预期的位置!
答案 9 :(得分:3)
对于Windows开发,我一直在使用软件验证Performance Validator - 它快速,合理准确且价格合理。最好的是,它可以检测正在运行的进程,并允许您在运行时打开和关闭数据收集,无论是手动还是基于callstack - 非常适合分析较大程序的一小部分。
答案 10 :(得分:3)
我使用devpartner作为个人电脑平台。
答案 11 :(得分:3)
对于Windows,我尝试过AMD Codeanalyst,Intel VTune和Visual Studio Team Edition中的分析器。
Codeanalyst是错误的(经常崩溃),而在我的代码中,其结果通常是不准确的。它的用户界面不直观。例如,要在配置文件结果中到达调用堆栈显示,您必须单击“进程”选项卡,然后单击程序的EXE文件名,然后单击其上带有小字母“CSS”的工具栏按钮。但它是免费软件,所以你可以尝试一下,并且它可以在没有AMD处理器的情况下工作(功能更少)。
VTune(700美元)有一个terrible user interface IMO;在一个大型程序中,很难找到你想要的特定调用树,你只能一次查看一个程序中的一个“节点”(一个具有直接调用者和被调用者的函数) - 你不能看一个完整的呼叫树。有一个调用图表视图,但我找不到一种方法来使相对执行时间出现在图表上。换句话说,无论花费多少时间,图中的函数看起来都是一样的 - 就好像它们完全错过了剖析点。
Visual Studio的探查器具有三者中最好的GUI,但由于某种原因,它无法从我的大多数代码中收集样本(仅在我的整个C ++程序中为一些函数收集样本)。此外,我找不到直接购买它的价格或方式;但它附带我公司的MSDN订阅。 Visual Studio支持托管代码,本机代码和混合代码;在这方面,我不确定其他两个剖析器。
总之,我还不知道一个好的剖析器!我一定会在这里查看其他建议。
答案 12 :(得分:3)
分析有不同的要求。检测代码是否正常,或者您是否需要分析优化代码(甚至已编译的代码)?您是否需要逐行的个人资料信息?你在运行哪个操作系统?您是否还需要配置共享库?跟踪系统调用怎么样?
就我个人而言,我个人使用oprofile,但在每种情况下,这可能都不是最好的选择。 Vtune和Shark也很出色。
答案 13 :(得分:3)
既然你没有提到你正在研究的平台,我会说Linux下的cachegrind。当然。它是Valgrind工具集的一部分。
http://valgrind.org/info/tools.html
我从未使用过它的子功能Callgrind,因为我的大多数代码优化都是针对内部函数。
请注意,有一个前端KCachegrind可用。
答案 14 :(得分:2)
我已经在Windows和Linux下使用VTune多年,效果非常好。后来的版本变得更糟,当他们将该产品外包给他们的俄罗斯开发人员时,质量和性能均下降(VTune崩溃增加,通常15分钟以上打开分析文件)。
关于仪器,您可能会发现它没有您想象的那么有用。在那种我已经致力于添加仪器的应用程序中,通常会减慢产品速度以至于它不再起作用(真实故事:启动应用程序,回家,第二天回来,应用程序仍在初始化)。此外,通过非仪表性分析,您可以对实时问题做出反应。例如,使用VTune远程日期收集器,我可以针对具有数百个同时连接的实时服务器启动采样会话,这些连接遇到性能问题并捕获生产中发生的问题,这些问题在测试环境中永远无法复制。
答案 15 :(得分:2)
ElectricFence非常适合malloc调试
答案 16 :(得分:2)
唯一敏感的答案是来自英特尔的PTU。当然最好在英特尔处理器上使用它,并至少在C2D机器上获得更有价值的结果,因为架构本身更容易回馈有意义的配置文件。
答案 17 :(得分:2)
我尝试过量化AQTime,而Quantify因其无价的“关注子树”和“删除子树”功能而获胜。
答案 18 :(得分:1)
我最喜欢的工具是Easy Profiler:http://code.google.com/p/easyprofiler/
这是一个编译时间分析器:必须使用一组例程手动检测源代码,以便描述目标区域。 但是,一旦运行应用程序并将度量自动写入XML文件,只需打开Observer应用程序并对分析/比较工具进行少量点击,然后才能在定性图表中查看结果。 / p>
答案 19 :(得分:1)
Windows下的Visual Studio 2010探查器。 VTune有一个很好的调用图工具,但它从Windows Vista / 7开始就被破坏了。我不知道他们是否修好了。
答案 20 :(得分:0)
让我为EQATEC提供一个插件...正是我所寻找的...简单易学和使用,并为我提供了快速找到热点所需的信息。我更喜欢它内置于Visual Studio中的内容(虽然我还没有尝试过VS 2010,但公平)。
拍摄快照的能力很大。我经常在等待真正的目标分析运行时进行额外的分析和优化...喜欢它。
哦,它的基本版本是免费的!
http://www.eqatec.com/Profiler/