2015-12-30 3 views
0

Я использую этот код для использования высчитывает процессора процесса:Расчет процента CPU текущего процесса

using System; 
using System.Timers; 

public partial class Service1 : ServiceBase 
{ 
    System.Timers.Timer CpuTimer = new System.Timers.Timer(); 
    public static TimeSpan LastCpuTime; 
    public static DateTime LastCpuTimeChecked; 

    protected override void OnStart(string[] args) 
    { 
     // Set up a timer to check the CPU every second or whatever. 
     CpuTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
     CpuTimer.Interval = 1000; 
     CpuTimer.Enabled = true; 
    } 

    private static void OnTimedEvent(object Source, ElapsedEventArgs e) 
    { 
     // Get the 
     Int16 CpuPercentage = GetCpuPercentage(System.Diagnostics.Process.GetCurrentProcess()); 
    } 

    private static Int16 GetCpuPercentage(System.Diagnostics.Process Process) 
    { 
     if (LastCpuTime == null) 
     { 
      // For the first run-through, we just need to start the clock. 
      LastCpuTime = Process.TotalProcessorTime; 
      LastCpuTimeChecked = DateTime.Now; 
     } 
     else 
     { 
      // How long since the last check? 
      TimeSpan TimeElapsed = DateTime.Now - LastCpuTimeChecked; 

      // How much CPU time was used? 
      TimeSpan CpuTimePerProc = (Process.TotalProcessorTime - LastCpuTime); 

      // Reset the clocks. 
      LastCpuTime = Process.TotalProcessorTime; 
      LastCpuTimeChecked = DateTime.Now; 

      // Calculate the percentage of CPU time used by this process. 
      Int16 CpuPercentage = (Int16)(
       (float)CpuTimePerProc.TotalMilliseconds/
       (float)TimeElapsed.TotalMilliseconds/
       Environment.ProcessorCount * 100 
      ); 
      return CpuPercentage; 
     } 

     // Return something if we don't yet have enough data. 
     return 0; 
    } 
} 

Но результат очень отличается от диспетчера задач (на 2-3 процента) .such разница также и с другими процессами.

Что может быть причиной этой разницы?

+0

Почему? Зачем пытаться вставить такую ​​диагностику внутри приложения? –

+0

Проблема не в том, «почему?». Проблема точности алгоритма. – aikidos

ответ

1

Помимо согласия с Дэмиеном, что то, что вы пытаетесь сделать, на самом деле не имеет смысла, есть много причин, по которым вы получите отличную от ожидаемого.

  1. Точность DateTime. Это уже ответит здесь: C# DateTime.Now precision. Подводя итог, DateTime не предназначен для точных измерений - это просто представление представления текущей даты и времени.
  2. Точность Processor.TotalProcessorTime. Это упоминается здесь: How we can reduce the resolution of myProcess.TotalProcessorTime?. Подводя итог, это основано на частоте прерывания тактовой частоты, которая по умолчанию гасит 64 раза в секунду.
+0

Спасибо за ответ. В общем, алгоритм правильный, но проблема в точности? – aikidos

Смежные вопросы