簡體   English   中英

使用clock()分析C ++線程

[英]Profiling C++ threads with clock()

我試圖測量gcc線程在我的系統上的執行情況。 我寫了一些非常簡單的測量代碼,就像這樣......

start = clock();
for(int i=0; i < thread_iters; i++) {
  pthread_mutex_lock(dataMutex);
  data++;
  pthread_mutex_unlock(dataMutex);
}
end = clock();

我通常使用CLOCKS_PER_SEC減去div和div來獲得1000000次迭代的大約2秒的經過時間。 然后我稍微更改了配置文件代碼,以便我測量每個mutex_lock / unlock調用的單獨時間。

for(int i=0; i < thread_iters; i++) {
  start1 = clock();
  pthread_mutex_lock(dataMutex);
  end1 = clock();
  lock_time+=(end1-start1);

  data++;

  start2 = clock();
  pthread_mutex_unlock(dataMutex);
  end2 = clock();
  unlock_time+=(end2-start2)
}

我獲得相同迭代次數的時間是鎖定:~27秒解鎖:~27秒

我明白了為什么程序的總時間增加,循環中的更多計時器調用。 但是系統調用的時間仍然不到2秒。 有人能幫我弄明白我哪里出錯了嗎? 謝謝!

clock調用還可以測量調用clock並從中返回所需的時間。 這在測量中引入了偏差。 即在clock功能深處的某個地方需要一個樣本。 但是在運行代碼之前,它必須從深度內部clock返回。 然后當你進行結束測量時,在那個時間采樣之前必須調用clock並且控制必須通過該功能深處的某個地方實際獲得時間。 因此,您將所有開銷作為測量的一部分。

您必須知道連續clock調用之間經過了多長時間(通過對多對clock調用進行一些采樣以獲得准確的平均值)。 這會給你一個基線偏差:在兩個時鍾樣本之間執行任何操作需要多長時間。 然后,您仔細地從測量值中減去偏差。

但是對clock調用可能會影響性能,因此您無法獲得准確的答案。 調用內核來獲取時鍾會干擾L1緩存和指令緩存。 對於像這樣的細粒度測量,最好下拉到內聯匯編並從CPU讀取循環計數寄存器。

在第一個示例中,最好使用clock :在多次迭代執行的事物周圍取樣,然后除以迭代次數來估計單次迭代時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM