簡體   English   中英

基准測試代碼 - 我做得對嗎?

[英]Benchmarking code - am I doing it right?

我想對C / C ++代碼進行基准測試。 我想測量cpu時間,掛起時間和周期/字節。 我寫了一些測量函數但是有周期/字節的問題。

要獲得CPU時間我寫了一個函數getrusage()RUSAGE_SELF ,牆體時間我使用clock_gettimeMONOTONIC ,讓次/字節我使用rdtsc

我處理一個大小的輸入緩沖區,例如1024: char buffer[1024] 我如何基准測試:

  1. 做一個熱身階段,只需調用fun2measure(args) 1000次:

for(int i=0; i<1000; i++) fun2measure(args);

  1. 然后,做一個實時基准測試,為牆上時間:

    `unsigned long i; 雙倍時間; double timeTotal = 3.0; //處理3秒

    for(timeTaken =(double)0,i = 0; timeTaken <= timeTotal; timeTaken = walltime(1),i ++)fun2measure(args); `

  2. 並且對於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]

我的問題:

  1. 那些結果好嗎?
  2. 為什么當我增加時間時我總是在cpu中得到0個周期/字節?
  3. 如何衡量此類基准測試的平均時間,平均值,標准差等統計數據?
  4. 我的基准測試方法100%可以嗎?

干杯!

第一次編輯:

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.

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