2010-08-19 1 views
2

나는 프로세서로드를 얻어야하는 C# 어플리케이션을 가지고 있습니다. 대답 this 질문에 대한 대답에 따르면, 내 옵션은 WMI 또는 System.Diagnostics 네임 스페이스의 성능 카운터를 사용하는 것입니다. 내 유일한 옵션은 WMI를 사용하기 때문에 System.Diagnostics 성능 카운터 (here)에 설명 된 문제가 있습니다. 다음 코드는 내가 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 메서드 호출 업데이트를 빠르게 만들 수 있습니까? 솔루션은 어떻게 든 ProcessorObject 속성을 업데이트하기 위해 ManagementObject 개체를 알리는 것입니다.하지만이를 수행하는 방법을 모르겠습니다.

출력의 샘플 시간이 0.5 초 정도로 매우 안정적인지는 궁금하지만, 솔루션에 대한 힌트를 줄 수 있는지 확실하지 않습니다.

답변

3

천천히해야합니다. 다른 방법은 없습니다. CPU 코어가 전체 보어에서 실행 중이거나 HALT 명령으로 꺼져 있습니다. 이로부터 인터럽트에 의해 다시 깨어납니다. 유효 CPU로드는 일정 기간 (일반적으로 1 초)에 대해 계산 된 평균입니다. 실행 시간을 기간으로 나눈 값입니다.

기간을 짧게하면 계산 된 값의 정확도가 떨어집니다. 너무 짧게하면 숫자는 0에서 100 사이로 점프합니다.

afaik WMI 쿼리에서 샘플 속도를 변경할 수 없습니다. 성능 카운터를 직접 읽음으로써 더 빠르고 (그리고 잡음이 많은) 업데이트를 얻을 수 있습니다. 내 대답은 this thread에 샘플 코드가 있습니다.

+0

감사합니다. 몇 가지 부정확성에 신경 쓰지 않는다면 샘플링 시간을 줄이는 방법에 대해 알고 있습니까? – Boris

+0

WMI를 사용하지 않는 경우 PerformanceCounter를 직접 사용하여 수행 할 수 있습니다. –

+0

샘플 코드에 대한 링크가 업데이트되었습니다. –

2

권장 사항 : 형식이 지정된 카운터 대신 Win32_PerfRawData_PerfOS_Processor 성능 카운터와 PERF_100NSEC_TIMER_INV 알고리즘을 사용하십시오. 반올림하면 상당히 부정확 한 결과가 발생할 수 있습니다.

+0

팁을위한 탱크 :). [예제 (VB)] (https://msdn.microsoft.com/en-us/library/aa392397(v=vs.85).aspx)를 적용하면 Powershell에서 FormattedData보다 더 빠른 솔루션을 구축 할 수 있습니다. 처음에는 더 정확 해 보이지만 배심원은 여전히 ​​그 중 하나입니다. :) –