2013-04-17 41 views
0

我想優化一個朋友給我的代碼塊,但是我的平均執行時間的基線非常不穩定,我失去了爲什麼/如何修復它。C函數的平均執行時間不穩定

代碼:

#include <sys/time.h> 
#include <time.h> 
#include <stdio.h> 
#include "wall.h" /* Where his code is */ 

int main() 
{ 
    int average; 
    struct timeval tv; 
    int i; 

    for(i = 0; i < 1000; i++) /* Running his code 1,000 times */ 
    { 
     gettimeofday(&tv, NULL); /* Starting time */ 

     start(); /* Launching his code */ 

     int ret = tv.tv_usec; /* Finishing time */ 
     ret /= 1000; /* Converting to milliseconds */ 
     average += ret; /* Adding to the average */ 
    } 
    printf("Average execution time: %d milliseconds\n", average/1000); 
    return 0; 
} 

5次不同的運行的輸出:

  • 804毫秒
  • 702毫秒
  • 394毫秒
  • 642毫秒
  • 705毫秒

我已經嘗試了多種不同的方式來獲得平均執行時間,但每個人都沒有給我一個足夠精確的答案,或給了我一個完全不穩定的答案。我失去了現在該做什麼,任何幫助將不勝感激!

我知道這些類型的基準測試都非常依賴於系統的,所以我在下面列出了我的系統規格:

  • 的Ubuntu 12.10 64
  • 7.8吉布RAM
  • 英特爾酷睿i7-3770 CPU @ 3.40GHz×8
  • 的GeForce GT 620 /的PCIe/SSE2

編輯

謝謝大家的意見,但我決定用gprof來代替構建我自己的。再一次感謝你!

+1

雖然測試基準確實是針對您所運行的硬件和操作系統的,但它更依賴於您所使用的代碼 評估。在這種情況下,我們無法看到該代碼。我會問,是否有任何文件IO發生。 –

+1

整個循環的時間如何? – nhahtdh

+5

'timeval'結構的'tv_usec'成員包含當前時間的微秒部分,而不是自Epoch起的微秒數。您不是在測量執行時間,而是在採樣微秒部分。觀察到的價值分佈是非常正常的(沒有雙關意圖)。 –

回答

1

這裏有幾個問題,包括零基準測試代碼的詳細信息,以及您使用「gettimeofday()」的錯誤(也許不正確)。

幾點建議:

1)不要使用 「的gettimeofday()」:

http://blog.habets.pp.se/2010/09/gettimeofday-should-never-be-used-to-measure-time

2)補充你的 「時間流逝」 使用gprof:

http://www.cs.duke.edu/~ola/courses/programming/gprof.html

+0

感謝您使用gprof指向正確的方向! :) – centip3de

5

你的線路int ret = tv.tv_usec; /* Finishing time */不會給你完成時間,它仍然是開始時間。你應該做第二個struct timeval,請撥打gettimeofday並比較兩者。

但是,使用clock()可能更容易。當然,如果你想真的分析你的代碼的性能,使用profiler

+0

我只是點擊「提交」...發現你也發佈了,基本上說完全一樣的東西。 +1:我完全同意所有觀點。恕我直言... – paulsm4

+0

儘管如此,發現gettimeofday()的文章令人沮喪。 ;) – Kninnug

+0

使用'clock()'可能有點棘手,因爲結果取決於操作系統。在大多數Unix系統上,它返回使用的CPU時間,而不是經過的掛鐘時間,但在Windows上它返回掛鐘時間。因此,我們應該使用'clock_gettime(CLOCK_REALTIME,&tp);'',其中'tp'是'struct timespec'。 –