有没有办法分别查询或计算每个每个核心的单进程的CPU使用率?
例如,
名称--- Core1 - Core2 - Core3 - Core4
firefox.exe - 0.5% -- 0.1% -- 0.2% -- 0.3%
我知道有一个叫做"Process Explorer“的程序( Mark Russinovich)可以做到这一点,但是在C#中如何做到这一点呢?我看过System.Diagnostics
名称空间,但我找不到任何符合我需求的名称空间。
这是我正在努力实现的一张图片,
发布于 2014-04-08 06:33:52
有一种方法可以获取这些信息,您需要使用内核调试器。我的怀疑是,如果Visual Studio Concurrency Visualizer可以获得这些信息来生成漂亮的报告和可视化效果,那么您也可以从Windows内核中获得这些信息以供使用。
你可以在这里看到一些文档http://msdn.microsoft.com/en-us/library/windows/hardware/ff552961(v=vs.85).aspx。
但是更有趣的事情可以通过反转在Visual Studio2012安装目录中找到的Microsoft.ConcurrencyVisualizer.dll来发现。我认为你也可以在你的项目中直接使用这个动态链接库,尽管你不能按照http://msdn.microsoft.com/en-US/vstudio/hh857605#files重新部署它。该动态链接库可在http://www.microsoft.com/en-us/download/details.aspx?id=41646上单独使用。
我们的想法是学习这个DLL如何使用内核跟踪来知道哪个线程在哪个核心上,并复制它以获得准确的统计信息。此外,我认为ProcessExplorer确实通过使用内核调试器API获得了一些统计数据,因为当我启动Concurrency Visualizer工具时,Visual Studio与它发生冲突。
这将是一件既有趣又困难的事情。
发布于 2013-09-25 02:44:57
发布于 2014-04-01 06:37:06
试试下面的(发现它是here)
int coreCount = 0;
foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_Processor").Get())
{
coreCount += int.Parse(item["NumberOfCores"].ToString());
}
PerformanceCounter[] pc = new PerformanceCounter[coreCount];
for (int i = 0; i < coreCount; i++)
{
pc[i] = new PerformanceCounter("Processor", "% Processor Time", i.ToString());
Console.WriteLine(pc[i].CounterName);
}
https://stackoverflow.com/questions/18945029
复制相似问题