
我的電腦有兩個處理器,我知道每個處理器的運作頻率為 1.86 GHz。
我想手動測量我的 PC 處理器的時脈脈衝,我的想法只是計算程式具有的彙編器行數與我的電腦執行它所花費的時間之間的商,所以我得到了數字CPU 每次處理的彙編指令數(這就是我對「時鐘週期」的理解)。我想按以下方式進行:
- 我編寫了一個 C 程式並將其轉換為彙編程式碼。
- I do:
$gcc -S my_program.c
,它告訴 gcc 編譯器執行整個編譯過程,除了最後一步:將 my_program.c 轉換為二進位物件。因此,我有一個名為 my_program.s 的文件,其中包含翻譯為彙編程式碼的 C 程式原始碼。 我計算程式的行數(我們稱這個數字為 N)。我做到了:
$ nl -l my_program.s | tail -n 1
並且我獲得了以下內容:1000015 .section .note.GNU-stack,"",@progbits
也就是說,該程式有一百萬行程式碼。
- 我這樣做:
$gcc my_program.c
這樣我就可以執行它。 我這樣做:(
$time ./a.out
“a.out”是 my_program.c 的二進位物件的名稱)來獲取運行程序所花費的時間(我們稱之為 T),我得到:real 0m0.059s user 0m0.000s sys 0m0.004s
假設我正在搜尋的時間 T 是清單中表示的第一個時間:“真實”,因為其他時間引用了在我執行的同一時刻在我的系統中運行的其他資源./a.out
。
所以我有 N=1000015 行和 T=0.059 秒。如果我進行 N/T 除法,我得到的頻率接近 17 MHz,這顯然是不正確的。
然後我想,也許我的電腦上運行著其他程式並消耗硬體資源(不進一步,作業系統本身)這一事實使得處理器“分割”其“處理能力”,並且它確實使時脈消失慢一些,但我不確定。
但我認為,如果這是正確的,我還應該找到我的程式消耗的 CPU 資源(或記憶體)的百分比,因為這樣我就可以真正渴望獲得關於我的真實 CPU 速度的(很好)近似結果。
這就引出瞭如何找出我的程式的「資源消耗值」的問題。我想過這個$ top
命令,但由於我的程式執行時間很短(0.059秒),它立即被丟棄;無法透過簡單的視覺來區分這段時間內記憶體使用的任何峰值。
所以,對於這個你有什麼想法?還是你建議我做什麼?我知道有一些程式可以完成我嘗試做的這項工作,但我更喜歡使用原始 bash 來完成它,因為我有興趣透過最「通用的方式」來完成它(看起來更可靠)。
答案1
那是行不通的。每個指令執行所需的時脈週期數(它們需要相當多的時脈週期,而不僅僅是一個)在很大程度上取決於它周圍的指令的確切組合,並且因特定的 CPU 型號而異。您還會收到中斷,並且內核和其他任務會與您的指令混合執行指令。最重要的是,頻率會根據負載和溫度動態變化。
現代 CPU 具有特定於型號的暫存器,可以精確計算時脈週期數。您可以讀取此內容,並使用高解析度計時器,在固定時間段後再次讀取它,然後比較兩者以找出該時間段內的(平均)頻率。