到目前为止,我只用过 Rational Quantify。我听说 Intel 的 VTune 很棒,但从未尝试过!
编辑:我主要寻找能够检测代码的软件,因为我猜测那可能是获得精细结果的唯一方法。
到目前为止,我只用过 Rational Quantify。我听说 Intel 的 VTune 很棒,但从未尝试过!
编辑:我主要寻找能够检测代码的软件,因为我猜测那可能是获得精细结果的唯一方法。
针对Linux开发(尽管其中一些工具可能适用于其他平台)。 这是我知道的两个重要工具,还有许多较小的工具已经有一段时间没有进行过活跃的开发。
对于Linux系统: Google Perftools
在我看来,使用调试器进行取样sampling using a debugger是最好的方法。你只需要一个IDE或调试器就可以让程序停下来。这样可以在安装分析器之前解决性能问题。
我唯一使用过的C++代码分析工具是由AutomatedQA(现在是SmartBear Software)开发的AQTime。它内置了几种类型的分析器(性能、内存、Windows句柄、异常跟踪、静态分析等),并对代码进行插桩以获取结果。
我很喜欢使用它——总是很有趣地找到那些代码微小更改可以显著提高性能的地方。
我以前从未进行过性能剖析。昨天我编写了一个ProfilingTimer类,其中包括静态时间表(a 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);
}
ProfilingTimer _ProfilingTimer("identifier");
这行代码在我想要分析的所有函数中添加起来有点麻烦,因为我必须猜测哪些函数需要很长时间。但它的效果很好,print函数会显示耗费时间的百分比。
(还有其他人使用类似的“自制分析”吗?或者这只是愚蠢的?但这很有趣!你们有什么改进建议吗?
是否有一种自动向所有函数添加一行代码的方法?)
Visual Studio 2008 中的分析器非常好用:快速、用户友好、清晰,并且与 IDE 集成良好。
毫无疑问,oprofile是最简单可靠的工具之一,它能够完成任务并提供各种漂亮的数据细分。
由于您没有提到您所使用的平台,我会建议在Linux下使用cachegrind。这是Valgrind工具集的一部分。
http://valgrind.org/info/tools.html
我从未使用过它的子功能Callgrind,因为我大多数的代码优化都是针对内部函数的。
请注意,有一个名为KCachegrind的前端可用。