适用于Windows的良好性能分析工具?

24

Windows有没有可用的体面的采样(例如非工具化)分析器? 最好类似于MacOS上的Shark,尽管我愿意接受在Windows上支付此类分析器的费用。

我已尝试过VS Team Suite中的分析器,但并不是特别满意,并且想知道是否有其他好的分析器。

[编辑:糟糕,我忘了说这是针对C / C ++而不是.NET--对于任何混淆感到抱歉]


我也很想得到一些不那么紧密绑定于VS的分析器建议,也就是那些可以独立运行,并且最好利用比pdb更多的调试信息格式。 - aib
9个回答

16

对于Windows操作系统,可以使用免费的Xperf工具,该工具随Windows SDK一起提供。它使用采样分析技术,具有一些有用的用户界面,并且不需要仪器设备。非常适合于解决性能问题。您可以回答以下问题:

谁正在使用最多的CPU?使用调用堆栈下钻到函数名称。

谁分配了最多的内存?

未解除的内存分配(泄漏)

谁在执行最多的注册表查询?

磁盘写入?等等。


1
XPerf看起来很不错,但它不能在XP上运行,它需要Vista或Server 2007或更新版本。很遗憾 - 功能听起来真的很棒,基于采样分析的调用堆栈捕获将非常方便。 - Suma
XPerf在Vista中大量依赖于经过改进的ETW,这是Vista/Server08中鲜为人知的改进之一。 - user15071
啊..是啊..XP不兼容。所以就开始了... :( - Joao Vilaca
1
Xperf使用Windows Vista添加的ETW基础架构。因此,它无法对应用程序进行分析;但是可以对整个系统进行分析。并且需要管理员权限、命令行访问才能启动和停止日志记录。也就是说,它不太友好。 - Ian Boyd

12

虽然这个问题被问了几个月,但我想指出一个不错的开源分析器:Very Sleepy

它没有之前提到的一些分析器所拥有的功能数目,但它是一个相当可敬的采样分析器,在大多数情况下都能很好地工作。


这看起来像是一个相当不错的分析器。但它需要能够对进程中的所有线程进行采样。而且进程选择器需要包括 PID(因为有许多 Chrome.exe 或 iexplore.exe 进程,但只有一个是父进程)。 - Ian Boyd
1
它在加载我想要分析的.exe文件时的成功率大约只有50%。不好玩。 - quant_dev
我已经成功运行并对可执行文件进行了分析,找到了热点。所有的调试符号都被正确加载,所以我知道该在哪里寻找。 - Michal Kottman
尽管使用了所有的调试符号,但我仍然很难让verySleepy找到我的程序源代码。 - Troyseph

11
Intel VTune是一款很好的、无需插桩的性能分析工具。我们评估了许多适用于Windows的分析器,发现在处理驱动程序代码时,这款工具表现最佳(同时也支持非托管用户级别的代码)。该工具的特别优势在于它可以读取所有英特尔处理器的性能计数器,因此你可以很好地理解为什么你的代码运行缓慢,并且它有助于将预取指令放入代码中,并优化数据结构使其更好地与高速缓存行配合使用,以及解决多核系统中高速缓存行失效的问题。

它是商业软件,我必须说它的用户界面并不是最方便的。


1
VTune是一个不错的工具,但它不是免费的,并且它不理解Windows内部机制。 - Foredecker
4
VTune的用户界面非常糟糕,我认为它非常令人不快。 - Matt Joiner

6

AMD的CodeAnalyst是免费的,在这里可以下载。


2
也许是一个愚蠢的问题,但是CodeAnalyst可以在英特尔CPU上工作吗? - Roddy

4

我们同时使用VTune和AQTime,我可以保证它们的可靠性。哪个更适合您取决于您的需求。两者都有免费试用版本-我建议您尝试一下。


我正在尝试比较VTune和AQTime。您能否提供更多关于它们功能的细节? - amit kumar
现在正在测试 AQTime,哇,AMD CodeAnalyst 的原始窗口甚至无法显示任何结果,但是这个...逐行性能、逐行反汇编、调用树,你说了算。到目前为止我很满意,而且所有功能都很容易使用。 - user1115652

3

Windows Driver Kit 包含一个非仪器化的用户/内核采样分析工具,名为"kernrate"。它对于分析多进程应用程序、大部分时间在内核中运行的应用程序和设备驱动程序非常有用(当然)。它还可在 KrView(Kernrate Viewer)Windows Server 2003 资源工具包 中使用。

Kernrate适用于Windows 2000及更高版本(与需要Vista / Server 2008的Xperf不同)。它基于命令行,文档中列出了一些有点吓人的选项。我不确定它是否可以记录调用堆栈或仅记录程序计数器。如果您使用符号服务器,请确保将最新的dbghelp.dllsymsrv.dll放在与kernrate.exe相同的目录中,以防止其使用安装在%SystemRoot%\system32中的古老版本的dbghelp.dll


2

两年前我曾尝试使用英特尔的VTune来处理一个相当大的项目。当时它是一款插装分析工具,但在为我要分析的DLL进行插装时花费了太长时间,最终我在一小时后失去了耐心。

我推荐的一个非常成功的工具是AQTime。它不仅提供了出色的性能分析资源,而且还提供了非常好的内存分析功能,这对我追踪内存泄漏问题非常有帮助。


Intel VTune 有两种模式:instrumenting 模式(可以生成调用堆栈和调用图)和 sampling 模式(仅限热点,无调用堆栈)。 - Suma

1

Luke Stackwalker 看起来很有前途——它不像我想要的那样精细,但它是开源的,而且它确实做了一些似乎非常接近 @Mike Dunlavey 建议我们做的事情。(当然,然后它试图将所有内容压缩到通常不太有帮助的调用图中,这让 Mike 很疲倦,但凭借源代码作为我们的盟友,修复这个问题也不应该太难。)

据我所知,它甚至能计算在内核中等待的时间...


我下载了Luke Stackwalker的源代码,希望能轻松地让它做出“正确的事情”,但我很失望,因为它在取样时会收集统计信息,然后将样本抛弃。这些统计信息是以函数为导向而不是以行为导向的,同时还有一些函数内的最小-最大行信息。如果他们只保留了样本,那么在行级别上给出包含该行的样本百分比并驱动蝴蝶式导航(Zoom&LTProf所做的),就会很容易了。那么对于严肃的程序员来说,他们只需要让您查看单个样本即可。 - Mike Dunlavey
他们扔掉样本的原因很可能是他们认为这些样本会占用太多存储空间。你知道我的答案。只需要少量的样本就足以找出问题,特别是如果你可以手动控制采样。大量的样本会给你更高的测量精度,但你并不需要这么多。 - Mike Dunlavey
@Mike: 嗯,听起来比我想象的要糟糕(显然,我记不清当时真正在想什么了;-)。不过...它似乎比"Hello World"更接近我们期望的工具。 - SamB
我也希望如此。如果没有真正的工作和家庭等干扰,我会开发一个分析器,也许可以从Luke Stackwalker源代码开始。实际上,我在'93年为DOS构建了一个分析器。它确实很好看,但对于真正的工作,我还是回到了手动方法。顺便说一下,LTProf对于Windows来说非常接近。 - Mike Dunlavey

-3

我不确定什么是非插装分析器,但对于.NET,我喜欢RedGate的ANTS Profiler。第3版相比微软版本更易于使用,而第4版允许任意时间片段,使得微软看起来像个笑话。


2
采样分析器通过定期观察程序的状态工作,因此是非侵入性的,并且可以在没有源代码的情况下处理可执行文件。(尽管您可能需要调试信息来解决函数调用等问题。)--如果我说错了,请纠正我。 - aib
@aib:确实有函数名称/堆栈布局信息会有所帮助,但当然.NET已经具备了这方面的功能(尽管可以将它们毁掉,使它们本质上成为数字...)。当然,行号也有帮助,而且无论如何都需要调试信息来获取它们。 - SamB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接