如何检测运行C#代码时发生的上下文切换次数?

时间:2020-03-06 14:57:26  来源:igfitidea点击:

通过C#,是否可以检测在特定线程上执行代码块时发生的上下文切换的数量?理想情况下,我想知道我的线程代码调度了多少次以及在哪个CPU上进行调度。

我知道我可以使用Windows事件跟踪等工具以及相关的查看器,但是要获取所需的数据似乎有点复杂。

同样,诸如Process Explorer之类的工具也使得很难判断由于特定代码块而发生了多少次切换。

背景:我正在尝试测试.NET中低级锁原语的实际性能(由于对我最近发表的一篇博文发表了一些评论。

解决方案

听起来我们可能正在寻找编程解决方案,但是如果没有,则Microsoft的Process Explorer工具将非常轻松地告诉我们特定线程的上下文切换次数。

进入工具后,双击进程,选择"线程"选项卡,然后选择线程。

.NET选项卡具有更特定的.NET相关性能数据。

我从未做过,但是以下几条线索可能会有所帮助:

  • .NET探查器API可能允许我们挂接? ICorProfilerCallback接口具有RuntimeThreadSuspended和RuntimeThreadResumed回调。但是对此博客文章的评论似乎表明他们无法为我们提供所需的信息:" RuntimeThreadSuspended是在运行时挂起线程时发出的,通常是在准备进行GC时。"
  • 有一个"上下文切换/秒"性能计数器可能会有所帮助。我没有专门研究此计数器,但是我猜想它可以在Win32线程而不是托管线程上运行。我们可以使用概要分析API来获取任何给定托管线程ID的Win32线程ID。

祝你好运! ;)

看起来procexp可能正在使用在其上具有ContextSwitches字段的内核线程(KTHREAD)或者执行线程(ETHREAD)数据结构。可能可以从托管代码中获得此信息。