我想基準一個C/C++代碼。我想測量cpu時間,壁掛時間和週期/字節。我寫了一些測量函數,但是在週期/字節上有問題。基準代碼 - 我做對了嗎?
要獲得CPU時間我寫了一個函數getrusage()
與RUSAGE_SELF
,牆體時間我使用clock_gettime
與MONOTONIC
,獲得週期/字節我用rdtsc
。
我處理的輸入緩衝區的大小,例如1024:char buffer[1024]
。我怎麼基準:
- 做一個預熱階段,只需撥打
fun2measure(args)
1000次:
for(int i=0; i<1000; i++) fun2measure(args);
然後,做一個真正的定時基準,爲掛鐘時間:
`unsigned long i; 雙倍拍攝; double timeTotal = 3.0; //處理3秒
for(timeTaken =(double)0,i = 0; timeTaken < = timeTotal; timeTaken = walltime(1),i ++) fun2measure(args); `
而且CPU時間(幾乎相同):
for (timeTaken=(double)0, i=0; timeTaken <= timeTotal; timeTaken = walltime(1), i++) fun2measure(args);
但是,當我想要得到功能的CPU週期數,我使用這段代碼:
`unsigned long s = cyclecount();
for (timeTaken=(double)0, i=0; timeTaken <= timeTotal; timeTaken = walltime(1), i++)
{
fun2measure(args);
}
unsigned long e = cyclecount();
unsigned long s = cyclecount();
for (timeTaken=(double)0, i=0; timeTaken <= timeTotal; timeTaken = cputime(1), i++)
{
fun2measure(args);
}
unsigned long e = cyclecount();`
然後計數週期/字節:((e - s)/(i * inputsSize);
。這裏inputsSize
是1024,因爲它的長度爲buffer
。但是,當我升到totalTime
爲10秒我GE奇怪的結果:
10秒:
Did fun2measure 1148531 times in 10.00 seconds for 1024 bytes, 0 cycles/byte [CPU]
Did fun2measure 1000221 times in 10.00 seconds for 1024 bytes, 3.000000 cycles/byte [WALL]
5秒:
Did fun2measure 578476 times in 5.00 seconds for 1024 bytes, 0 cycles/byte [CPU]
Did fun2measure 499542 times in 5.00 seconds for 1024 bytes, 7.000000 cycles/byte [WALL]
4秒:
Did fun2measure 456828 times in 4.00 seconds for 1024 bytes, 4 cycles/byte [CPU]
Did fun2measure 396612 times in 4.00 seconds for 1024 bytes, 3.000000 cycles/byte [WALL]
我的問題:
- 這些結果是否正常?
- 爲什麼當我增加時間我總是得到0循環/字節在CPU?
- 如何測量此類基準測試的平均時間,平均值,標準差等統計數據?
- 我的基準測試方法100%可以嗎?
CHEERS!
1日編輯:
Did fun2measure 1138164.00 times in 10.00 seconds for 1024 bytes, 0.410739 cycles/byte [CPU]
Did fun2measure 999849.00 times in 10.00 seconds for 1024 bytes, 3.382036 cycles/byte [WALL]
我的結果似乎是確定:
改變i
到double
後。所以問題#2不再是一個問題了:)
當你計算週期/字節時要小心使用浮點除法 –
@VaughnCato:爲什麼?我應該用'i = 1'嗎?你的意思是我可能在這裏處理'零分割錯誤'? – nullpointer
如果您不使用浮點除法,那麼小於1的值將舍入爲零。 –