繁体   English   中英

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

[英]Visual Studio Diagnostic Tools under reporting compute time

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

示例代码

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

诊断入口点

分析时间

此方法中的 CPU 样本仅表明它花费了大约1000 毫秒来执行:

CPU使用率

来电者 被叫者

轮廓

执行时间处理时间

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

诊断时间表

问题

  • 什么可能导致分析时没有显示这么长的执行时间线?

我尝试过的事情:

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

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

官方文档对此有何评论?

看了这里,没啥好说的。 然后在这里,我发现了一个非常有趣的观点。 正如您在下面看到的那样,文档包含一个演示,该演示显示了像您一样的CPU Usage选项卡。 但是有[External Call]标记的函数,它们不是微不足道的。 文档指出:

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

由于您的示例不包含此功能,因此它们可能在执行时间 - 总 cpu 时间之间创建了此余量。 您可以查看此链接,查看CPU Usage选项卡中外部代码的调用路径。 默认情况下它们被禁用。

图1

但即使这种情况属实,也不能解释1000ms - 50s的时间差。

继续寻找..

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

图2

在使用选项卡中显示Total CPU [unit, %] 具体是什么单位? 在上述相同的文档中,他们指出:

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

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

CPU 使用率指标

我搜索了很多,发现了这篇文章,它把我重定向到了这个发霉的文档 它是关于Profiler Instrumentation Data的,他们指出:

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

之后,我查看了更多更新的文档,但他们将其称为仅毫秒,就像上面的引用一样。 但是这个旧文档给了我一个火花。 如果他们指的是 cpu 循环计数,这说明了一切。 它们不包括空闲 state、中断、锁定和帐户中的作业优先级。 实际上,当您考虑它时,这是一件明智的事情。 CPU 以离散的方式处理函数。 这样,您每次都可以获得更一致的结果。

你的问题

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM