2011-06-06 95 views
2

我想計算兩個時間點之間的平均CPU使用率。 我使用T1-t0和Process.TotalProcessorTime1之間的比率 - Process.TotalProcessorTime0 (其中t是實際DateTime.Now在該點)Process.TotalProcessorTime超過實際的時間傳遞

但有時當計算機正忙於我得到在蜱的TotalProcessorTime差大於實際的時間(在Ticks中)通過,所以我的cpu%超過了100.

那怎麼可能?

long currentLogTime = DateTime.Now.Ticks; 
long currentSPUUsageTime = _process.TotalProcessorTime.Ticks; 

long timeDiff= currentLogTime - m_LastLogTime; 
if (timeDiff != 0) 
{ 
    cpuUsage = (currentSPUUsageTime - m_LastCPUUsageTime) * 100/timeDiff; 
} 

回答

4

如果一個進程使用多個處理器,它可以使用比實時更快的處理器時間。

+0

亦稱免費午餐! – 2011-06-06 14:42:35

+0

所以我應該除以機器中的處理器內核數量? – tsvikaw 2011-06-06 14:45:57

+0

如果要計算已用處理器時間佔可用的最大處理器時間的百分比,則爲yes(除非您的進程僅限於機器邏輯處理器的某個子集)。 – phoog 2011-06-06 14:48:29

1

DateTime.Now的測量分辨率低於TotalProcessorTime

您需要使用高分辨率計時器來測量已用時間。考慮爲此目的使用Stopwatch實例。

當你開始一個新的「登錄時期」使用StartNew方法:

 m_stopwatch = Stopwatch.StartNew(); 

然後,只需閱讀ElapsedTicks屬性,以確定有多少時間已經過去了:

 long timeDiff= m_stopwatch.ElapsedTicks;