正在报告计算时间的 Visual Studio 诊断工具

Kyl*_*Mit 9 .net asp.net profiler visual-studio visual-studio-2017

我无法共享整个代码库来重现该问题,但我正在使用Visual Studio 诊断工具来检查性能,并且执行 CPU 使用率报告的操作所需的时间要长很多倍。

示例代码

这是两个断点之间有问题的代码块的示例:

诊断入口点

分析时间

此方法中的 CPU 示例仅表明执行时间约为1000 毫秒:

CPU使用率

被叫方

轮廓

执行时间处理时间

但是,断点之间需要将近50 秒

诊断时间表

题

  • 什么可能导致如此长的执行时间线在分析时不显示?

我尝试过的事情:

  • 重启VS
  • 重启机器
  • 重新加载符号
  • 缓存符号

Dor*_*taş 3

实际上我并不经常使用分析工具。但听起来很有趣的是,总 CPU 时间并不等于总执行时间。我搜索了它,我想与我的思考过程分享我的发现。

官方文档对此有何说明?

我看了这里,没说什么。然后在这里我发现了一个非常有趣的点。正如您在下面看到的,文档包含一个演示,其中显示了CPU Usage与您类似的选项卡。但是有[External Call]标记的函数,而且它们并不简单。文件指出:

外部代码是系统和框架组件中的函数,由您编写的代码执行。外部代码包括启动和停止应用程序、绘制 UI、控制线程以及向应用程序提供其他低级服务的函数。大多数情况下,您不会对外部代码感兴趣,因此 CPU 使用率工具将用户方法的外部函数收集到一个 [外部代码] 节点中。

由于您的示例不包含此函数,因此它们可能在 exec 时间 - 总 cpu 时间之间创建了这个裕度。您可以查看此链接,在选项卡中查看外部代码的调用路径CPU Usage。默认情况下它们是禁用的。

图1

但即使这个情况属实,也无法解释时差1000ms - 50s。

继续寻找..

经过一番搜索后我发现了这个。另一个关于分析 CPU 使用情况的文档。他们使用的演示与您的演示非常相似,如下所示。即使使用外部代码,也几乎存在60s差异。这就是我开始思考的地方Are we comparing apples with peanuts?。

图2

在使用选项卡中它说Total CPU [unit, %]。具体是什么单位?在上面的同一文档中,他们指出:

总 CPU [单位,%] 在选定的时间范围内,调用函数以及函数调用的函数所使用的毫秒数和 CPU 百分比。这与 CPU 利用率时间线图不同,后者将某个时间范围内的总 CPU 活动与总可用 CPU 进行比较。

好的,以毫秒为单位,我们明白了。但它到底代表什么。

CPU 使用指标

我搜索了很多并发现了这篇文章,它将我重定向到这个发霉的文档。这是关于Profiler 仪器数据,他们指出:

时间直接执行此函数所花费的时间(以毫秒 (msec) 或处理器周期(刻度)为单位),不包括在此函数调用的子函数中所花费的时间。

之后我查看了更多更新的文档,但他们将其称为只有毫秒,就像上面的引用一样。但这份旧文档给了我灵感。如果他们指的是 CPU 周期计数,这就解释了一切。它们不包括空闲状态、中断、锁定和作业优先级。事实上,当你考虑到这一点时,这是一件明智的事情。CPU 以离散方式处理功能。通过这种方式,您每次都可以获得更一致的结果。

你的问题

如果我的研究正确的话,我认为当你开始执行时,它会捕获你的函数花费在 cpu 上的时间。它不会在捕获时间中添加此事件的持续时间:函数相互等待、函数等待 I/O、操作系统决定接管进程、高优先级进程接管、线程锁、WINDOWS UPDATE...即使总捕获时间其功能之一是1ms根据计算机的不同,可能需要几分钟才能完成任务。CPU 执行时间是离散的,但断点之间的时间是连续的。这就是为什么它们之间有余量。