85

到目前为止,我只使用了 Rational Quantify。我听说过有关英特尔 VTune 的好消息,但从未尝试过!

编辑:我主要是在寻找可以检测代码的软件,因为我想这是获得非常好的结果的唯一方法。


也可以看看:

Windows 上的原生 C++ 有哪些好的分析器?

4

21 回答 21

36

用于 linux 开发(尽管其中一些工具可能适用于其他平台)。这是我所知道的两个大品牌,还有很多其他较小的品牌已经有一段时间没有看到积极的发展了。

于 2008-08-25T19:32:57.327 回答
29

对于 Linux: 谷歌 Perftools

  • 比 valgrind 快(但是,粒度不那么细)
  • 不需要代码检测
  • 漂亮的图形输出(--> kcachegrind)
  • 进行内存分析、cpu 分析、泄漏检查
于 2008-09-16T08:22:12.873 回答
9

恕我直言,使用调试器进行采样是最好的方法。您所需要的只是一个可以让您停止程序的 IDE 或调试器。它甚至在您安装分析器之前就解决了您的性能问题。

于 2008-11-05T00:33:26.457 回答
7

我对 C++ 代码进行剖析的唯一经验是使用AutomatedQA(现为 SmartBear Software)的AQTime。它内置了几种类型的分析器(性能、内存、Windows 句柄、异常跟踪、静态分析等),并检测代码以获得结果。

我喜欢使用它 - 找到那些代码中的微小变化可以显着提高性能的地方总是很有趣。

于 2008-08-25T19:23:13.730 回答
6

我以前从未做过分析。昨天我编写了一个带有静态时间表(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");

这条线在我想要分析的所有函数中添加有点麻烦,因为我必须猜测哪些函数需要很多时间。但它运行良好,打印功能以 % 显示消耗的时间。

(还有其他人在使用任何类似的“自制分析”吗?还是只是愚蠢?但这很有趣!有人有改进建议吗?

是否有某种自动为所有功能添加一行的功能?)

于 2010-11-20T14:33:40.537 回答
5

我过去广泛使用过Glowcode,除了积极的体验外,什么都没有。它的 Visual Studio 集成非常好,它是我用过的最高效/最直观的分析器(甚至与托管代码的分析器相比)。

显然,如果您不在 Windows 上运行,那将毫无用处,但这个问题让我不清楚您的要求到底是什么。

于 2008-08-25T19:27:10.977 回答
5

oprofile,毫无疑问;它简单,可靠,可以完成工作,并且可以提供各种漂亮的数据细分。

于 2008-09-16T08:24:26.690 回答
5

Visual Studio 2008中的分析器非常好:快速、用户友好、清晰并且很好地集成在 IDE 中。

于 2009-09-22T07:18:32.270 回答
4

对于 Windows,请查看Xperf。它使用采样配置文件,具有一些有用的 UI,并且不需要检测。对于跟踪性能问题非常有用。您可以回答以下问题:

  • 谁使用的 CPU 最多?使用调用堆栈深入到函数名称。
  • 谁分配的内存最多?
  • 谁做的注册表查询最多?
  • 磁盘写入?等等

当您发现瓶颈时,您会感到非常惊讶,因为它们可能不是您预期的!

于 2008-09-24T13:54:03.277 回答
4

由于您没有提及您正在使用的平台,我会说 Linux 下的 cachegrind。确实。它是 Valgrind 工具集的一部分。

http://valgrind.org/info/tools.html

我从未使用过它的子功能 Callgrind,因为我的大部分代码优化都是针对内部函数的。

请注意,有一个可用的前端 KCachegrind。

于 2008-09-24T21:02:45.977 回答
4

对于 Windows,我尝试过 AMD Codeanalyst、Intel VTune 和 Visual Studio Team Edition 中的分析器。

Codeanalyst 有问题(经常崩溃),在我的代码中,它的结果通常不准确。它的用户界面不直观。例如,要在配置文件结果中显示调用堆栈,您必须单击“进程”选项卡,然后单击程序的 EXE 文件名,然后单击带有小字母“CSS”的工具栏按钮。但它是免费软件,因此您不妨尝试一下,它可以在没有 AMD 处理器的情况下工作(功能较少)。

VTune(700 美元)的IMO用户界面很糟糕;在大型程序中,很难找到您想要的特定调用树,并且您一次只能查看程序中的一个“节点”(具有直接调用者和被调用者的函数)——您无法查看完整的调用树。有一个调用图视图,但我找不到让相对执行时间出现在图上的方法。换句话说,无论在图中花费了多少时间,图中的函数看起来都是一样的——就好像它们完全错过了分析的要点。

Visual Studio 的分析器拥有三者中最好的 GUI,但由于某种原因,它无法从我的大部分代码中收集样本(样本仅针对我的整个 C++ 程序中的少数函数收集)。另外,我找不到直接购买的价格或方式;但它附带我公司的 MSDN 订阅。Visual Studio 支持托管、本机和混合代码;在这方面,我不确定其他两个分析器。

总之,我还不知道一个好的分析器!我一定会在这里查看其他建议。

于 2008-09-30T21:57:52.557 回答
3

对于 Windows 开发,我一直在使用 Software Verification 的Performance Validator——它快速、准确且价格合理。最棒的是,它可以检测正在运行的进程,并允许您在运行时手动和基于调用堆栈打开和关闭数据收集 - 非常适合分析较大程序的一小部分。

于 2008-09-30T15:38:45.837 回答
3

剖析有不同的要求。检测代码是否可以,或者您是否需要分析优化代码(甚至已经编译的代码)?您需要逐行的个人资料信息吗?您正在运行哪个操作系统?您是否还需要分析共享库?跟踪到系统调用呢?

就我个人而言,我所做的每件事都使用 oprofile,但这可能不是每种情况下的最佳选择。Vtune 和 Shark 也都非常出色。

于 2008-08-25T19:12:02.183 回答
3

我将devpartner用于 pc 平台。

于 2008-11-05T00:48:00.627 回答
2

我在 Windows 和 Linux 下使用 VTune 多年,效果非常好。后来的版本变得更糟,当他们将该产品外包给他们的俄罗斯开发团队时,质量和性能都下降了(增加了 VTune 崩溃,通常需要 15 分钟以上才能打开分析文件)。

关于仪表,您可能会发现它没有您想象的那么有用。在我从事过的那种应用程序中,添加仪器通常会使产品速度变慢以至于它不再工作(真实故事:启动应用程序,回家,第二天回来,应用程序仍在初始化)。此外,通过非仪器化分析,您可以对实际问题做出反应。例如,使用 VTune 远程数据收集器,我可以针对具有数百个同时连接的实时服务器启动一个采样会话,这些连接正在经历性能问题,并捕获生产中发生的问题,而这些问题我永远无法在测试环境中复制。

于 2008-09-30T16:37:32.840 回答
2

ElectricFence 非常适合 malloc 调试

于 2008-10-06T17:00:47.657 回答
2

我尝试过 Quantify 一个 AQTime,Quantify 之所以获胜,是因为它具有无价的“专注于子树”和“删除子树”功能。

于 2008-09-16T20:41:15.717 回答
2

唯一敏感的答案是英特尔的PTU。当然,最好在英特尔处理器上使用它,并至少在 C2D 机器上获得更有价值的结果,因为架构本身更容易返回有意义的配置文件。

于 2008-09-21T13:47:40.777 回答
1

Windows 下的 Visual Studio 2010 分析器。VTune 有一个很棒的调用图工具,但在 Windows Vista/7 中它被破坏了。我不知道他们是否修好了。

于 2010-11-20T14:38:14.790 回答
1

我最喜欢的工具是 Easy Profiler:http ://code.google.com/p/easyprofiler/

它是一个编译时分析器:必须使用一组例程手动检测源代码,以便描述目标区域。但是,一旦应用程序运行并自动将测量值写入 XML 文件,只需打开 Observer 应用程序并在分析/比较工具上单击几下,您就可以在定性图表中看到结果。

于 2010-06-10T08:53:59.007 回答
0

让我为 EQATEC 提供一个插件......正是我想要的......简单易学和使用,并为我提供快速找到热点所需的信息。我更喜欢它而不是 Visual Studio 内置的那个(虽然我还没有尝试过 VS 2010,公平地说)。

拍摄快照的能力是巨大的。在等待真正的目标分析运行时,我经常会完成额外的分析和优化……喜欢它。

哦,它的基本版本是免费的!
http://www.eqatec.com/Profiler/

于 2011-10-01T10:04:56.277 回答