您最喜欢的分析工具是什么(针对C ++)?


82

到目前为止,我只使用过Rational Quantify。我听说过有关英特尔VTune的很棒的事情,但是从未尝试过!

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


也可以看看:

Windows上本机C ++有哪些好的分析器?


您要1)进行测量,还是要2)查找加速?如果您想要2,而您认为需要1,则并非如此。要查找加速,您不需要“非常好的结果”。如果程序花了90%的时间在做某事,那么如果您知道它是什么,就可以很好地删除它,堆栈样本将向您展示10次中的9次。如果您查看10个样本,您是否在乎是否看到了是10倍,9倍还是8倍?无论哪种方式,您都知道它是什么。所测量的百分比无关紧要。
Mike Dunlavey

Answers:



27

对于Linux: Google Perftools

  • 比valgrind更快(但不是那么细)
  • 不需要代码检测
  • 精美的图形输出(-> kcachegrind)
  • 是否进行内存分析,CPU分析,泄漏检查

9

恕我直言,使用调试器采样是最好的方法。您只需要一个IDE或调试器即可停止程序。在安装探查器之前,它就解决了性能问题。


3
是! 这对我来说很棒。它不需要仪器。它不需要安装任何分析器等。在Linux上,您可以使用gdb。程序以全速运行。按Ctrl-C停止。输入“ bt”以显示堆栈跟踪。然后按“ c”继续,然后再次按ctrl-c。很棒!使用这种技术,在一个复杂的程序中,我的执行时间减少了20%。太棒了!
休·珀金斯

@HughPerkins:感谢您的编辑,很高兴您能成功。(我敢打赌,您可以做的比20%好:)
Mike Dunlavey 2014年

1
是的,在几个小时的工作中,我仅使用gdb + ctrl-c就能将迭代时间从1​​200ms降低到200ms :-)
Hugh Perkins 2014年

@HughPerkins:对我来说,如果我正在编写自己的代码,很难知道何时停止尝试-似乎我总是可以再压缩一点。当我在处理别人的代码时,可能会出现问题。我不能总是说服代码的“所有者”来解决问题,因此过程停滞了。这是一个有趣的难题。
Mike Dunlavey 2014年

如果您只想在不使用工具的情况下实现此目的,则在Linux上甚至都不需要调试器或IDE。只需运行“ pstack <pid>”即可堆栈跟踪当前正在运行的指令。它比启动调试器然后手动中断然后寻找stacktrace更为简单。
Manish Sogi

7

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

我很喜欢使用它-找到那些可以在代码上进行很小的更改就可以显着提高性能的地方总是很有趣。


不幸的是,这仅适用于Windows。
布拉姆'18

6

我从来没有做过分析。昨天,我使用静态时间表(映射<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");

由于我必须猜测哪些功能会花费很多时间,因此在要分析的所有功能中添加此行有点麻烦。但是它运行良好,并且打印功能以%显示消耗的时间。

(其他人是否正在使用任何类似的“自制配置文件”?或者仅仅是愚蠢?但这很有趣!有人有改进建议吗?

是否有某种自动向所有功能添加行的方法?)


5

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

显然,如果您没有在Windows上运行,那就没用了,但是问题仍然使我不清楚您的要求是什么。


5

毫无疑问 它简单,可靠,能胜任工作,并且可以提供各种精美的数据细分。


5

Visual Studio 2008中的事件探查器非常出色:快速,用户友好,清晰并且可以很好地集成到IDE中。


2
探查器不是仅在Team版本中吗?
dwj

@dwj:我不确定。我正在使用Visual Studio Team System 2008开发版。
Dimitri C. 2010年

看起来只有2010
dwj

4

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

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

当您发现瓶颈时,您会感到很惊讶,因为它们可能不在您预期的位置!


3

分析有不同的要求。插装的代码可以,还是您需要分析优化的代码(甚至是已编译的代码)?您是否需要逐行配置文件信息?您正在运行哪个操作系统?您还需要分析共享库吗?跟踪系统调用怎么办?

就个人而言,我将oprofile用于我所做的所有事情,但这并不是每种情况下的最佳选择。Vtune和Shark都很出色。


3

由于您没有提到正在使用的平台,因此我将在Linux下说cachegrind。绝对是 它是Valgrind工具集的一部分。

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

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

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


3

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


3

对于Windows,我尝试了Visual Studio Team Edition中的AMD Codeanalyst,Intel VTune和事件探查器。

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

VTune($ 700)的用户界面IMO糟透了。在大型程序中,很难找到想要的特定调用树,并且一次只能查看程序中的一个“节点”(具有其直接调用者和被调用者的功能),而您无法查看完整的呼叫树。有一个调用图视图,但是我找不到使相对执行时间显示在图上的方法。换句话说,无论花了多少时间,图中的功能看起来都一样-好像它们完全错过了性能分析的要点。

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

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



2

我尝试了Quantify AQTime,并且Quantify赢得了大奖,因为它具有宝贵的“专注于子树”和“删除子树”功能。


完全确认。我只需要对C ++应用程序进行一些性能分析,而这些正是我真正度过的确切功能。
恩诺

2

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


2

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

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



1

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

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


1

Windows下的Visual Studio 2010分析器。VTune有一个很棒的调用图工具,但是从Windows Vista / 7开始它就坏了。我不知道他们是否解决了。


0

让我为EQATEC提供插头...正是我想要的...易于学习和使用,并为我提供了快速找到热点所需的信息。与Visual Studio内置的相比,我更喜欢它(尽管公平地说,我还没有尝试过VS 2010)。

拍摄快照的能力非常强大。在等待真正的目标分析运行时,我经常得到额外的分析和优化……喜欢它。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.