2012-06-10 79 views
5

我們的商業模式需要根據CPU使用小時數對用戶收費。計算CPU使用率

最初我在考慮簡單地使用StopWatch,然後使用經過時間作爲度量單位。

但是我用這種方法看到的問題是,在5000個用戶點擊服務器的當天,當只有50個用戶點擊時,同一段代碼的流逝時間將高於夜間時間服務器。

其他選項是基於對傳入的數據用戶執行的迭代向用戶收費。此方法也存在一些問題。

  • 某些函數不需要對數據進行任何迭代。
  • x + y的CPU使用率低於x + y * z

在C#/ .Net中計算CPU使用率信息的好方法是什麼,以便所有用戶在同一操作中保持不變,而不管服務器的負載如何?

可能是實際裝配水平指令的總量?有沒有辦法在C#中獲取這些信息?

還有什麼其他方法可以分享?

非常感謝您關注此事。

回答

14

執行您的用戶希望在單獨的process中運行的任何內容,並在完成該過程後查找其CPU time。這與wallclock時間也不同,因爲它只考慮進程實際在CPU上運行的時間。

對於那些誰也不願意閱讀文檔小例子:

ProcessStartInfo psi = new ProcessStartInfo(@"C:\Blah\Foo.exe"); 
Process p = Process.Start(psi); 
p.WaitForExit(); 
TimeSpan time = p.TotalProcessorTime; 
p.Close(); 

您可能需要異步運行這一點,雖然。

不需要估計,猜測或黑魔法。無論如何你都無法可靠地計算出來。

+2

你能分享一些在獨立進程中執行代碼並獲得CPU時間的例子嗎? – Moon

+0

+1對於「不願意閱讀文檔的人」(以及正確答案:-)) – phoog

+0

順便說一句,如果我想跟蹤一個函數的使用情況,該怎麼辦?我可以將這些代碼包裝在一個exe文件中。但有沒有更好的辦法? 如果該函數在後臺線程中執行一些其他任務,它們是否會成爲同一進程的一部分,並會影響'TotalProcessTime'? – Moon