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