WMI LoadPercentage调用非常慢

时间:2011-03-28 22:10:02

标签: c# performance wmi

我正在尝试使用WMI来检查我的CPU负载(Xeon,4核)。我正在运行XP 64(SP2)。

private void button1_Click(object sender, EventArgs e)
    {
        Dictionary<string, string> cpuInfo = new Dictionary<string, string>();


        ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Processor");

        foreach (ManagementObject queryObj in searcher.Get())
        {
            cpuInfo.Add("LoadPercentage"+queryObj["DeviceID"].ToString(), queryObj["LoadPercentage"].ToString());
        }

        foreach (KeyValuePair<string,string> kvp in cpuInfo)
        {
            richTextBox1.AppendText(String.Format("{0} {1}\n", kvp.Key, kvp.Value));
        }
    }

上面的示例运行,但速度非常慢,大约5秒钟。这是WMI问题还是我做了一些根本错误的事情?

1 个答案:

答案 0 :(得分:0)

好的,我提供这个作为答案,虽然它可能不是 - 但我发现它不适合单独评论。

我在Windows XP SP3和Windows 7上遇到同样的问题。只要在WMI查询中包含LoadPercentage属性,每个物理处理器运行大约1秒(即Win32_Processor的实例) 。反之亦然:如果我在查询中包含所有属性,但不包含LoadPercentage属性,则它会在几毫秒内运行。

使用自定义或操作系统提供的多种工具(即wmic cpu)可以观察到此行为。

我只能推测原因是什么,它可能与LoadPercentage的{​​{3}}有关(强调添加):

  

每个处理器的负载容量,平均为 最后一秒 。   处理器负载是指每个处理器负载的总计算负担   处理器一次。此属性继承自CIM_Processor。

WMI提供程序的实现实际上可能需要1秒钟才能在您拨打电话时对“平均到最后一秒”的负载百分比进行采样。我猜想提供商会在后台以某种方式做到这一点,并且只返回它在调用时的内容。但无论如何,这只是猜测。

UPDATE :FWIW,Windows 8开发者预览版似乎表现出相同的行为。