物理時候我測量這樣的兩個事件之間的物理時間:邏輯時間與在Ubuntu Linux操作系統
#include <time.h>
#include <sys/time.h>
timeval wall_time0;
timeval wall_time1;
// start of period measurement
gettimeofday(&wall_time0 , 0);
...stuff happening
// end of period measurement
gettimeofday(&wall_time1 , 0);
return ((wall_time1.tv_sec - wall_time0.tv_sec) + ((wall_time1.tv_usec - wall_time0.tv_usec)/(double)1000000));
但現在,我需要一種方法來衡量該線程實際上是使用邏輯的時間。也就是說,理論上應該是物理時間,減去運行其他線程和/或系統內核邏輯的時間。
我認爲這是爲了做到這一點:
clock_t mTime0;
clock_t mTime1;
//start of period measurement
mTime0=clock();
... stuff happening
//end of period measurement
mTime1=clock();
return (mTime1-mTime0)/(double)CLOCKS_PER_SEC;
,但做了幾個測試,我注意到兩個問題:
1)一些測量它比物理大時間,這是不正確的(即:對於某個循環,物理時間將爲0.2495 ..並且「邏輯」(用clock()測量)將爲0.27,對於較小的測量,它將舍入到零,這導致第二個問題......)
2)由此產生的時間似乎比通過gettimeofday返回一個更粗糙
有沒有更好的方法來衡量本地線程時間在Linux?
似乎這種解決方案也不完整;顯然,從一段時間以來,rusage的結果不會有新的價值(我的猜測是,直到下一次上下文交換重新輸入時纔會獲得新的值)。如果這個假設是有效的,那就意味着每次邏輯時間改變時都必須實施一個hackaround,存儲物理時間,那麼只要報告的邏輯時間沒有改變,就必須添加自上次改變以來的物理時間增量。並且這可能既不是完全準確的,因爲我不知道在上次上下文交換之前有多遠。把時間帶到linux郵件列表 – lurscher 2010-10-26 18:31:59
我也嘗試過'clock_gettime',結果是'getrusage'的結果和'gettimeofday'的結果之間的中間值,並且由於我們最終是在一個可靠的基準測量之後,我不相信任何選擇都比另一個更好... http://www.guyrutenberg.com/2007/09/22/profiling-code-using-clock_gettime/ – lurscher 2010-10-30 21:37:27