[英]Benchmarking code - am I doing it right?
我想對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
這里inputsSize
是1024,因為它是buffer
的長度。但是當我將totalTime
上升到10s時,我得到奇怪的結果:
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]
5s:
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]
4s:
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]
我的問題:
干杯!
第一次編輯:
將i
改為double
:
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]
我的結果似乎沒問題。 問題#2不再是一個問題:)
您的cyclecount基准測試存在缺陷,因為它包含walltime / cputime函數調用的成本。 但總的來說,我強烈建議你使用合適的探測器,而不是試圖重新發明輪子。 特別是性能計數器將為您提供您可以信賴的數字。 另請注意,循環非常不可靠,因為CPU通常不以固定頻率運行,或者內核可能會執行任務切換並暫停應用程序一段時間。
我個人寫基准測試,他們運行一個給定的函數N次,因為N足夠大,以便你得到足夠的樣本。 在外部,然后我應用一個分析器,如linux perf,以獲得一些硬數據來推理。 在給定時間內重復基准測試,您可以計算stddev / avg值,您可以在運行基准測試的腳本中執行幾次並評估分析器的輸出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.