Windows 是否有任何像样的采样(例如非仪器)分析器可用?最好是类似于 MacOS 上的 Shark 的东西,尽管我愿意接受我将不得不为 Windows 上的这种分析器付费。
我已经在 VS Team Suite 中尝试过探查器,并没有给我留下太深刻的印象,我想知道是否还有其他好的探查器。
[编辑:Erk,我忘了说这是针对 C/C++,而不是 .NET - 抱歉有任何混淆]
Windows 是否有任何像样的采样(例如非仪器)分析器可用?最好是类似于 MacOS 上的 Shark 的东西,尽管我愿意接受我将不得不为 Windows 上的这种分析器付费。
我已经在 VS Team Suite 中尝试过探查器,并没有给我留下太深刻的印象,我想知道是否还有其他好的探查器。
[编辑:Erk,我忘了说这是针对 C/C++,而不是 .NET - 抱歉有任何混淆]
对于 Windows,请查看随 Windows SDK 提供的免费Xperf。它使用采样配置文件,具有一些有用的 UI,并且不需要检测。对于跟踪性能问题非常有用。您可以回答以下问题:
谁使用的 CPU 最多?使用调用堆栈深入到函数名称。
谁分配的内存最多?
未完成的内存分配(泄漏)
谁做的注册表查询最多?
磁盘写入?等等
我知道我在问这个问题几个月后添加了我的答案,但我想我会指出一个体面的开源分析器:Very Sleepy。
它没有前面提到的其他一些分析器所做的功能计数,但它是一个非常受人尊敬的采样分析器,在大多数情况下都可以很好地工作。
英特尔 VTune很好,而且是非仪表化的。我们评估了一大堆适用于 Windows 的分析器,这是处理驱动程序代码的最佳选择(尽管它也处理非托管用户级代码)。一个特别的优势是它读取所有英特尔处理器性能计数器,因此您可以很好地了解您的代码运行缓慢的原因,并且对于将预取指令放入我们的代码和整理数据布局以与缓存线,以及缓存线在多核系统中失效的方式。
它是商业的,我不得不说它不是世界上最简单的用户界面。
AMD 的 CodeAnalyst在这里免费
我们同时使用 VTune 和 AQTime,我可以保证两者。哪个最适合您取决于您的需求。两者都有免费试用版 - 我建议您试一试。
Windows 驱动程序工具包包括一个名为“kernrate”的非仪器用户/内核采样分析器。它似乎对分析多进程应用程序、大部分时间在内核中的应用程序和设备驱动程序(当然)很有用。KrView (Kernrate Viewer)和Windows Server 2003 资源工具包工具包中也提供了它。
Kernrate 适用于 Windows 2000 及更高版本(与需要 Vista / Server 2008 的 Xperf 不同)。它是基于命令行的,文档中有一些令人生畏的选项列表。我不确定它是否可以记录调用堆栈或只是程序计数器。如果您使用符号服务器,请确保将最新版本放在同一目录中,dbghelp.dll
以防止它使用安装在.symsrv.dll
kernrate.exe
dbghelp.dll
%SystemRoot%\system32
大约两年前,我在一个相当大的项目中尝试过英特尔的 vtune。当时它是一个检测分析器,我花了很长时间来检测我试图分析的 DLL,以至于一个小时后我最终失去了耐心。
我取得了相当大的成功并且我强烈推荐的一个工具是AQTime。它不仅提供了出色的性能分析资源,而且还提供了非常好的内存分析,这对我跟踪内存泄漏有很大帮助。
Luke Stackwalker似乎很有希望——它没有我想要的那么完美,但它是开源的,它确实做了一些看起来非常接近@Mike Dunlavey 一直说我们应该做的事情。(当然,它会尝试将其全部归结为 Mike 厌倦的通常无用的调用图,但以源作为我们的盟友来解决这个问题应该不会太难。)
据我所知,它甚至似乎计算了在内核中等待的时间......
我不确定什么是非仪器分析器,但我可以说对于 .NET,我喜欢 RedGate 的 ANTS Profiler。第 3 版在易用性方面优于 MS 版,第 4 版允许任意时间片,让 MS 看起来像个笑话。