3

是否有可能测量 C# 中进程上下文切换的大致时间?如果是,如何?

我根据《Cracking the Coding Interview: 150 Programming Questions and Solutions 》一书提出了这个问题。

他们的解决方案是:

假设只有 2 个进程,P1 和 P2。(是一个巨大的近似值,我相信还有更准确的)

P1 正在执行,P2 正在等待执行。在某些时候,操作系统必须交换 P1 和 P2 - 假设它发生在 P1 的第 N 条指令处。因此,上下文切换时间为:

Time_Stamp(P2_1) - TimeStamp(P2_N)

其中一个问题是我们无法记录过程中每条指令的时间戳。而且我们不考虑其他进程之间的上下文切换所花费的时间。

4

2 回答 2

1

您可以使用 WMI(Windows 管理规范)

例子:

ManagementScope managementScope = new ManagementScope("\\\\.\\ROOT\\cimv2");
ObjectQuery objectQuery = new ObjectQuery("SELECT * FROM Win32_PerfFormattedData_PerfProc_Thread");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(managementScope, objectQuery);
ManagementObjectCollection objectCollection = searcher.Get();

foreach (ManagementObject m in objectCollection)
{
    Console.WriteLine("ContextSwitchesPersec : {0}", m["ContextSwitchesPersec"]);
}
于 2012-12-05T01:50:47.470 回答
0

进程上下文切换由操作系统完成,与 .NET 或 C# 无关。

您可以使用 Windows 性能监视器监控每秒上下文切换的数量,但进程本身不知道任何上下文切换。

您还可以使用Process Explorer来监视上下文切换和单个进程的增量,这些默认情况下不显示,但可以从“视图”、“选择列”、“性能”选项卡中添加

于 2012-12-05T01:23:21.653 回答