2

プロセッサの負荷を取得する必要があるC#アプリケーションがあります。この質問に対する受け入れられた回答によると、私のオプションは、WMIまたはSystem.Diagnostics名前空間のいずれかからのパフォーマンスカウンターを使用することです。System.Diagnosticsパフォーマンスカウンターに問題があるため(ここに記載されています)、唯一のオプションはWMIを使用することです。次のコードは、WMIを使用してプロセッサの負荷を読み取る方法を示しています。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management;

namespace ProcessorUtilizationSpike
{
    class Program
    {
        private static ManagementObject processor;

        static void Main(string[] args)
        {
            processor = new ManagementObject("Win32_PerfFormattedData_PerfOS_Processor.Name='_Total'");

            while(true)
            {
                PrintTimedMeasure();
            }
        }

        static void PrintTimedMeasure()
        {
            DateTime start = DateTime.Now;
            UInt64 wmi = WMIMeasure();
            DateTime stop = DateTime.Now;
            Console.WriteLine("wmi : " + wmi + ", time: " + (stop - start));
        }

        static UInt64 WMIMeasure()
        {
            processor.Get();
            return ((UInt64)processor.Properties["PercentProcessorTime"].Value); // this property corresponds to a UInt64, see the Type property.
        }
    }
}

私の問題は、この典型的な出力スニペットからわかるように、プロセッサの使用率を取得するのに約0.5秒かかることです。

wmi : 6, time: 00:00:00.5156250
wmi : 3, time: 00:00:00.5156250
wmi : 4, time: 00:00:00.5000000
wmi : 3, time: 00:00:00.5156250
wmi : 3, time: 00:00:00.5000000

私の推測では、負荷のサンプリングに非常に時間がかかる理由の少なくとも一部は、Getメソッド呼び出しがManagementObjectオブジェクトの他のプロパティも更新することです。だから私の質問は:Getメソッド呼び出しの更新をより速くするにはどうすればよいですか?解決策は、どういうわけかManagementObjectオブジェクトにプロセッサの負荷プロパティのみを更新するように指示することだと思いますが、その方法がわかりません。

余談ですが、出力のサンプル時間が約0.5秒で非常に安定しているのは不思議ですが、それが解決策のヒントになるかどうかはわかりません。

4

2 に答える 2

3

ゆっくりしなければなりません。他に方法はありません。CPU コアがフルボアで実行されているか、HALT 命令によってオフになっています。そこから割り込みによって再び起こされます。有効な CPU 負荷は、一定期間 (通常は 1 秒間) にわたって計算された平均です。実行されていた時間を期間で割ったもの。

期間を短くすると、計算値の精度が低下します。短すぎると、数値が 0 から 100 の間でジャンプします。

Afaik の WMI クエリでサンプル レートを変更することはできません。パフォーマンス カウンターを直接読み取ることで、より迅速な (そしてノイズの多い) 更新を取得できます。このスレッドの私の回答にサンプル コードがあります。

于 2010-08-19T18:31:13.370 に答える
2

推奨事項: フォーマットされたカウンターの代わりに、Win32_PerfRawData_PerfOS_Processor パフォーマンス カウンターと PERF_100NSEC_TIMER_INV アルゴリズムを使用します。丸めにより、かなり不正確な結果が生じる可能性があります。

于 2011-12-09T20:52:09.593 に答える