我们最喜欢的分析工具是什么(对于C ++)

时间:2020-03-05 18:42:57  来源:igfitidea点击:

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

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

也可以看看:

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

解决方案

回答

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

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

回答

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

我很喜欢使用它,找到那些只需少量更改代码即可显着提高性能的地方总是很有趣。

回答

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

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

回答

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

  • 瓦尔格朗德
  • TAU-调整和分析实用程序

回答

对于Linux:
Google Perftools

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

回答

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

回答

我尝试了Quantify AQTime,而Quantify则因其"专注于子树"和"删除子树"的宝贵功能而获胜。

回答

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

回答

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

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

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

回答

由于我们没有提到要使用的平台,因此我将在Linux下说cachegrind。确实。它是Valgrind工具集的一部分。

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

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

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

回答

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

回答

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

关于仪器,我们可能会发现它没有我们想象的有用。在我添加仪器的过程中,这类应用通常会使产品的运行速度大大降低,以致无法正常工作(真实的故事:启动应用程序,回家,第二天回来,应用程序仍在初始化)。此外,使用非仪器化配置文件,我们可以应对现场问题。例如,使用VTune远程日期收集器,我可以针对具有数百个同时连接的实时服务器启动一个采样会话,该服务器遇到性能问题,并捕获生产中发生的问题,而这些问题在测试环境中是无法复制的。

回答

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

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

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

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

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

回答

ElectricFence可以很好地进行malloc调试

回答

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

回答

我将devpartner用于PC平台。

回答

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

回答

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

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

回答

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

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

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

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

回答

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