我已經用C編寫了一個程序。它是一個作爲研究結果而創建的程序。我想計算程序消耗的確切CPU週期。確切的週期數。 任何想法我怎麼能找到它?測量進程消耗的CPU時鐘
回答
不,你不能。 「CPU週期」的概念沒有明確定義。現代芯片可以以多種時鐘速率運行,並且它們的不同部分可以在不同的時間做不同的事情。
在某些情況下,「總共有多少管道步驟」可能會有意義,但不太可能有辦法解決。
對不起,但沒有,至少不是爲了大多數實際目的 - 對於大多數正常的操作系統來說這是不可能的。舉例來說,不少操作系統並沒有進行完整的上下文切換來處理中斷,因此花費在中斷服務上的時間往往會花費時間花費在中斷髮生時正在執行的任何進程上。
「不是用於實際目的」將指示在循環精確模擬器下運行程序的可能性。這些都是可用的,但主要是針對主要用於實時嵌入式系統的CPU,而不是像全面的PC。更糟糕的是,他們(通常)不是爲了運行像完整的操作系統,而是運行在「裸機」上的代碼。
從理論上講,您可能可以通過運行諸如Windows或Linux之類的虛擬機來完成某些操作 - 但我不知道任何現有的虛擬機試圖嘗試哪種虛擬機,而且這絕對是不平凡的,在表現上可能會有相當嚴重的後果(說得溫和)。
valgrind
工具cachegrind
(valgrind --tool=cachegrind
)會給你一個詳細的輸出,包括執行指令的數量,緩存未命中和分支預測未命中。這些可以歸結爲單獨的彙編程序線,因此原則上(知道您的確切架構),您可以從此輸出中獲得精確的循環計數。
知道由於緩存效應,它會從執行變爲執行。
嘗試OProfile。它使用CPU上的各種硬件計數器來測量已執行指令的數量和已經過多少個週期。您可以在文章Memory part 7: Memory performance tools中看到它的一個例子。
我不完全相信我確切知道你在做什麼,但是現代x86處理器可以做什麼就是在你感興趣的代碼塊前後讀取time stamp counter(TSC) 。在彙編層面,這是通過使用RDTSC
指令完成的,該指令爲您提供edx:eax
寄存器對中TSC的值。
但是請注意,這種方法有一定的注意事項,例如,如果你的進程在CPU0上開始,並在CPU1上結束,你從RDTSC
得到的結果將指向執行該指令的特定處理器內核,因此可能無法進行比較。 (也有缺乏指令序列化與RDTSC
,但在這方面,我不認爲這是一個問題。)
- 1. 如何測量進程的CPU消耗量?
- 2. 我的進程的CPU消耗
- 3. 測量CPU /存儲器消耗
- 4. 後臺進程不斷消耗高CPU
- 5. Elastic Beanstalk Ruby進程消耗CPU
- 6. 使Java的外部進程消耗大量CPU
- 7. Aforge.net消耗大量的CPU電量
- 8. Java定時器消耗CPU
- 9. 測量CPU和子進程
- 10. Tomcat消耗高CPU
- 11. ElasticSearch消耗100%CPU
- 12. clr.sll!StrongNameSignatureVerification CPU消耗
- 13. AVAudioPlayer CPU消耗95%?
- 14. 每個進程的內存消耗量
- 15. 在EC2上的RabbitMQ消耗CPU的CPU
- 16. 我的應用程序消耗高CPU
- 17. apache spark過程的CPU消耗
- 18. Android - CPU使用率和電量消耗
- 19. IntelliJ IDEA 13 CE消耗大量CPU
- 20. 消耗100%CPU的JVM
- 21. 消耗CPU高的瑕疵
- 22. 爲什麼Apache Nifi進程消耗大約30%的CPU資源?
- 23. JAX-WS線程消耗%100 CPU
- 24. Tkinter程序消耗所有內存/ CPU
- 25. Ubuntu kworker線程消耗100%CPU
- 26. 跟蹤線程內存和CPU消耗
- 27. Akka IO應用程序消耗100%cpu
- 28. 在運行時(性能,CPU消耗)
- 29. linux機制來測量進程內存消耗f
- 30. Perl腳本消耗100%cpu
確切的。那些優化指令流並可能重疊指令的處理器呢?這算什麼? http://software.intel.com/en-us/articles/branch-and-loop-reorganization-to-prevent-mispredicts/ – 2010-04-06 21:06:37