ManagementObjectSearcher WMIquery 非常慢

ManagementObjectSearcher WMIquery very slow

我有一个 .NET 6.0 代码,我 运行 反复监视机器上的 CPU 并将统计信息发送到仪表板服务器:

var stopwatch = Stopwatch.StartNew();
var processorQuery = new ManagementObjectSearcher().WMIquery("select * from Win32_Processor");
Log(stopwatch.ElapsedMilliseconds); // !!! 2 to 10 seconds!

// now process the results
var processors = new JArray();
foreach (var processorMO in processorQuery) {
  var name = processorMO["Name"]?.ToString() ?? "";
  var addressWidth = Double.Parse(processorMO["AddressWidth"]?.ToString() ?? "-1");
  if (name.IndexOf(addressWidth.ToString()) != -1) name = $"{name} x{addressWidth}";
  var maxClockSpeedGHz = Double.Parse(processorMO["MaxClockSpeed"]?.ToString() ?? "-1000") / 1000.0;
  if (name.IndexOf(maxClockSpeedGHz.ToString()) != -1) name = $"{name} {maxClockSpeedGHz}GHz";
  var numberOfCores = Double.Parse(processorMO["NumberOfCores"]?.ToString() ?? "-1");
  name = $"{name} {numberOfCores}cores";
  name = name.Replace("CPU ", " ").Replace(" M ", " M").Replace(" @ ", " ");
  name = string.Join(" ", name.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)); // replace multiple spaces with single
  int loadPercentage = (int)Double.Parse(processorMO["LoadPercentage"]?.ToString() ?? "-1");
  processors.Add(new JObject() { { "Name", name }, { "LoadPercentage", loadPercentage } });
}

我的问题是对 WMIquery 的调用非常 慢.. 从 2.5 到 10 秒!

我做错了什么吗?有没有办法更快地获取这些信息?


(PS 还有哪些标签在这里有用?)

它很慢,因为你正在做 select *,其中包括诸如 LoadPercentage 之类的东西,这不是 WMI 从其数据库中获取的东西,它是在查询并需要 至少 秒才能完成并对负载进行准确评估。由于您似乎确实需要 LoadPercentage,因此除了等待之外您无能为力。我根本不会担心这个,也许更多地关注每个查询抑制的 CPU/IO 惩罚。

您可以使用 GetSystemTimes,它为您提供所有内核的空闲时间、内核时间和用户时间。 如果你这样做,例如每一秒,您都可以自己以更有效的方式计算总体 CPU 利用率。

  • C# System CPU Usage and syncing with Windows Task Manager