2010-11-05 61 views
1

我試圖衡量長時間運行過程中的CPU利用率水平。我懷疑每次運行task-manager查看數據時,由於taskmanager具有更高的優先級,因此進程的CPU利用率下降。如果我給予我的進程實時優先級,那麼任務管理器完全鎖定,我無法使用它。我希望我的大部分CPU週期專用於此過程,並且我想大致瞭解它的使用量。我不需要一秒鐘的顯示器,只需要幾張快照讓我知道發生了什麼。我怎樣才能做到這一點?衡量/測量沒有TaskMgr的CPU使用率?

+1

做的特性*不*設置你的進程,以實時,如果你想別的運行(如您的鼠標光標)。 – Gabe 2010-11-06 21:06:07

回答

1

編程方式使用C API,你可以使用性能計數器API。 (CPU使用率只是另一個計數器)。您可以使用low-level registry API to query the performance counter作爲數據。或者你可以使用PDH API(性能數據助手API) - 這可能是你想要的。我已經在過去使用過,PDH api很容易使用。

另一個幫助枚舉可用計數器名稱的工具是perfmon。 (只需運行c:\ windows \ system32 \ perfmon.exe)。它也是任務管理器的有用替代方案。它也做記錄和圖表。您可以爲多處理器上的每個邏輯處理器設置計數器。

+0

C API無法訪問,但對perfmon有很好的建議!我總是忘記使用該工具。本文有幫助:http://adminfoo.net/2007/04/windows-perfmon-top-ten-counters.html – SFun28 2010-11-08 17:31:03

0

我不知道你對任務管理器的關注是有效的。任務管理器足夠輕便,不會淹沒長時間運行的進程並竊取足夠的CPU週期。如果你的過程真的是那個CPU餓了,你會在任務管理器中看到它。如果你沒有看到你所期望的CPU使用率太高,那麼你的假設是你的過程需要一段時間,因爲它使用了大量的CPU是錯誤的。也許你的長時間運行過程是長時間運行的,因爲它的IO限制或等待事件或睡眠很多。即做其他事情比使用CPU。如果它使用大量CPU但不是100%,或許它的效率不如我上面列出的相同原因。

+0

當我的進程設置爲實時時,什麼能解釋taskmgr凍結,但當優先級設置爲高時工作正常嗎?我的過程主要是CPU限制的(實際上我只是自動化Excel,Excel是這裏所討論的真正的過程 - 它的處理計算繁重) – SFun28 2010-11-08 17:24:30

+0

沒有設計成實時運行的過程將凍結其餘的系統如果他們不屈服時間。即它們需要被設計成實時優先運行。具有實時優先級的凍結行爲可能會發生在沒有爲其設計的任何應用程序上。 – bot403 2010-11-08 17:55:21

0

你可以寫在行通過GetProcessTimes

一些微不足道的工具,查詢這個特定的進程(通過ID,比如):

main() 
    HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, id); 
    for(;;) { 
    GetProcessTimes(h, /*..times.. */); 
    printf("time taken %d\n", (kerneltime+usertime)); 
    Sleep(1000); 
    } 
+0

我敢肯定,在.net中可能有這樣做的方法。我在十年內沒有碰過C++。尋找一個開箱即用的工具。將嘗試這個職位上的其他建議像perfmon和sysinternals的東西。 – SFun28 2010-11-08 17:26:16

0

@馬丁貝克特:procmon中,您可以看到詳細的CPU使用率在特定的工藝