2013-03-10 62 views
0

我試圖瞭解性能API,但我有一個問題,以瞭解PdhGetFormattedCounterValue函數和dwFormat參數。PdhGetFormattedCounterValue和正確格式

如何在調用此函數時知道選擇哪種格式?

我發現MSDN上的PDH_COUNTER_INFO結構,看到這個結構具有dwType成員,但我仍然不知道如何使用這個結構來獲取計數器形式成功地調用PdhGetFormattedCounterValue功能的信息。

回答

2

你可以選擇。

許多計數器都是以分數計算的,或者它們是縮放的或兩者都有,所以它們有小數部分。這使得PDH_FMT_DOUBLE是一個不錯的選擇。

某些計數器類型從不具有小數部分。你可以可以閱讀所有的文檔,並找出哪些,然後添加兩條代碼路徑來處理「可能是分數的計數器」和「不會分數的計數器」,但是這對於很少的工作是很多的工作獲利還是無。

只需使用PDH_FMT_DOUBLE

更新

對於大多數計數器的精度僅是終值,PDH庫內恰好的計算過程中一個問題。但是,正如你所說的,批量總計(如磁盤空閒空間)的精度可能是是一個問題。令人高興的是,事實並非如此。

double有52位有效數。對於以字節報告的計數器,這有4PB的空間而沒有任何精度損失。

但是磁盤可用空間是以兆字節報告的,而不是字節,所以雙精度可報告多達2 字節或4 zettabytes而不會損失精度。我敢肯定你的單個音量不能大於2個字節。

內存使用(進程等)以字節爲單位進行報告,但其值始終爲頁大小(4096字節)的倍數,因此任何報告值的最低12位均爲零。因此,double可以表示多達2個字節的存儲器大小 - 即整個64位存儲器空間 - 而不會損失精度。

精度不是問題。只需使用PDH_FMT_DOUBLE

+0

嗨,我在想你的評論,我想我可能會在使用雙打時遇到精確性問題。在有大量內存或大容量硬盤的服務器系統上,這可能會出現問題。 – roohan 2013-03-11 22:53:25

+0

我更新了我的答案。 – arx 2013-03-12 12:10:33