2014-10-11 48 views
5

我跑PERF以下空的程序分析,PERF的統計給出了不同數量的指令的每次運行

#include <stdio.h> 
int main() { 
} 

編譯和運行PERF統計./a.out我得到了下面的輸出說法(以及之後其他數據,如週期數,任務時鐘等):

418,869 instructions # 0.87 insns per cycle 

的指令變化期間每「PERF」在相同的小精靈數目分析。

我的實際需要是在我寫的特定函數中找到指令的數量。所以我會從新程序中的指令數中減去上面的數字(我可以用在gcc中使用-S標籤創建的program.s中的行數,但在查看perf行爲後我感到困惑)

爲什麼指令的數量不一致,確切的不一致?

更新 我跟着man page給使用perf_event_open(c)中

回答

4

要測量的通過你的函數執行的指令數,我建議啓動和停止功能的入口事件與perf_event_open()計數的例子並退出而不是運行兩次你的程序有和沒有功能。

關於由空程序執行的指令數量的非確定性,您可能正在計算用戶和內核域中的事件。我認爲在兩次運行之間用戶的地盤數應該保持不變,但對於內核部分來說,執行這個程序背後有很多事情發生,所以我猜測非確定性來自內核代碼中發生的事情。要只計算用戶空間指令,您可以使用:

perf stat -e instructions:u a.out 

您能否提供有關差異的更多詳細信息?

+0

perf_event_open()給了我一個精確的計數,它等於.s文件中的指令數。 perf stat -e指令:u a.out每次都會給出不同的計數值,但變化並不像問題中解釋的場景那麼大。 – Vignesh 2014-10-12 23:04:27

+0

使用perf_event_open你完全nkwo你測量。對於即使在添加之後仍然存在的(小)變化:u我猜在程序中的主函數被調用之前,用戶空間中仍然有許多事情已經完成,並且這裏可能有一些變化。 – 2014-10-13 11:04:06

相關問題