【解決方法】CPU の currentClockSpeed、minClockSpeed、maxClockSped を取得する方法

プログラミングQA


CPU の currentClockSpeed、minClockSpeed、maxClockSped を取得できますか。
これを行うためにwmiを使用しましたが、結果は良くないと思います。
minClockSpeed はなく、currentClockSpeed と maxClockSped は同じ値です。
現在のClockSpeedは変わっていません。私のPCのCPUはI5-2300です。ターボブーストをサポートしています。
どんな助けでも大歓迎です。

解決策 1

これを使用して試すことができます..

C#
using System;
using System.Management;
using Microsoft.Win32;
namespace ConsoleApplication1
{
        class Program
    {
        
        static void Main(string[] args)
        {
            CPUSpeed();
        }
     
        public static void CPUSpeed()
        {
            uint CurrentClockSpeed, MaxClockSpeed;
            using (ManagementObject Mobj = new ManagementObject("Win32_Processor.DeviceID='CPU0'"))
            {
                CurrentClockSpeed = (uint)(Mobj["CurrentClockSpeed"]);
                MaxClockSpeed = (uint)(Mobj["MaxClockSpeed"]);


                Console.WriteLine("CurrentClockSpeed: " + CurrentClockSpeed);
                Console.WriteLine("MaxClockSpeed: " + MaxClockSpeed);
               
                Console.ReadLine();
            }
        }
    }
    }

解決策 4

上記のアプローチは非常に遅いことが判明しました。 これは、ManagementObject によってクエリがフェッチされる方法が原因である可能性が最も高いです。 代わりに ManagementObjectSearcher を使用することをお勧めします。

明示的なクエリは、返されるデータの量を絞り込み、パフォーマンスを大幅に向上させます。

private uint? clockSpeed() {
  uint? uSpeed = default;
  if (OperatingSystem.IsWindows()) {    // Suppress SupportedOSPlatform warnings
#if TestSlowManagementObject
    const String sPath = "Win32_Processor.DeviceID='CPU0'";
    using var mo = new ManagementObject(sPath);
    uSpeed = (uint)mo["CurrentClockSpeed"];
#else
    //[Note]Specifying the CurrentClockSpeed column improves performance
    const String sQuery = "select CurrentClockSpeed from Win32_Processor";
    using var mos = new ManagementObjectSearcher(sQuery);
    foreach (var mbo in mos.Get()) {
      var properties = mbo.Properties.Cast<PropertyData>();
      var pd = properties.FirstOrDefault(pd =>
        OperatingSystem.IsWindows() &&
        pd.Name == "CurrentClockSpeed");

      if (pd != null) {
        uSpeed = (uint)pd.Value;
        break;
      }
    }
#endif
  }
  return uSpeed;
}

コメント

タイトルとURLをコピーしました