使用采样方法
进行分析时,分析器以一种类似于调试程序的方式附加到正在运行的进程。然后,分析器会定期中断进程并检查哪个函数处于堆栈顶部以及该函数的代码路径。换句话说,Visual Studio 分析器收集当前进程状态的样本。采样是一种非入侵式统计型分析方法。在函数中收集的样本越多,函数可能执行的处理就越多。
Visual Studio 分析器还会收集有关导致此执行的调用路径的信息。因此,此工具可在分析收集的数据后显示整个调用堆栈。默认情况下,Visual Studio 分析器每 1 千万个 CPU 周期收集一个样本。除 CPU 周期外,还可能在出现其他事件(如页面错误、系统调用、CPU 高速缓存缺失等等)时执行采样。分析会话的属性控制分析器的取样对象以及频率。
作为一个低开销解决方案,采样常常是推荐选项。但值得注意的是,采样仅在程序有效使用 CPU 时收集信息。因此,当进程在等待磁盘、网络或任意其他资源时,Visual Studio 分析器均不会收集样本。这就是如果应用程序并未有效使用 CPU,建议使用检测分析的原因。
在检测模式中,Visual Studio 分析器通过在每个函数的开头和结尾处注入特殊指令(称为探针)来修改(检测)二进制文件。探针允许分析器度量运行每个函数所花的时间。此外,分析器还会在每个外部函数调用周围添加一对探针,从而可确定这些外部调用的开销。
通过使用检测分析,可准确测量各种数据,如运行函数所花时间(“经过的时间”)、函数的调用次数以及函数正在使用 CPU(“应用程序时间”)且未被 OS 切换出来的时间。检测的缺点是收集了大量数据,因而需要花费更长的分析时间。此外,此分析模式还具有更高的运行时开销。更高开销可能不经意间更改所分析应用程序的性能特征。
通过同时使用采样和检测,还可收集基于 Microsoft® .NET Framework 的应用程序的内存分配数据。用户可使用性能会话属性页面启用和调整 .NET 内存分配数据的收集。它通常被称为内存分析,并且有大量关于该主题的 MSDN® 文档。请注意,它是分析器中唯一一个仅用于 .NET Framework 兼容代码的功能。对于其他功能,Visual Studio 分析器在本机 C/C++ 和基于 .NET 的应用程序之间完全相同。