2014-01-06 43 views
1

我希望找到一種方法來衡量的幾個函數的執行時間在爲C.循環例如,有這樣的代碼:如何測量的幾個功能執行時間的循環使用C

for(;;) 
{ 
    func1(); 
    func2(); 
    func3(); 
} 

我想知道程序在func1()(或func2,func3)上花費了多少時間。

我知道我可以用clock()來測量時間。然而,在這種情況下,如果我寫的代碼是這樣的:

for(;;) 
{ 
    a = clock(); 
    func1(); 
    b = clock(); 
    time_func1 += (b-a); 
    a = clock(); 
    func2(); 
    b = clock(); 
    time_func2 += (b-a); 
    a = clock(); 
    func3(); 
    b = clock(); 
    time_func3 += (b-a); 
} 

它看起來像太蠢,結果不準確。

回答

3

如果你在Linux上,我建議你使用clock_gettime。這使得精確的時間測量具有多個時鐘,並且具有高分辨率。 clock本身的分辨率很低。

也許一句話就其使用:

timespec t1, t2; 

clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &t1); 
/* CODE TO BE MEASURED */ 
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &t2); 
1

clock()具有非常低的分辨率。根據您的操作系統,有更準確的功能。在Windows中,有QueryPerformanceCounters

0

塞巴斯蒂安是正確的,

根據該男子頁,POSIX的功能時鐘()返回時鐘的滴答近似(它們意味着什麼用近似?)程序使用。您必須除以每秒鐘的時鐘數來獲得執行時間。 這是通過:

int main() { 
    clock_t start; 
    clock_t end; 
    double cpu_time_used; 

    start = clock(); 
    # do some computations 
    end = clock(); 

    cpu_time_used = ((double) (end-start))/CLOCKS_PER_SEC; 
} 

這是很容易使用,你得到的CPU蜱調用進程,但精度爲毫秒。

如果您需要更高的精度,POSIX函數clock_gettime()精度爲納秒級。您可以指定檢索全系統,每進程或線程特定的已用時間。這裏有一個例子:

int main() {  
    timespec start; 
    timespec end; 

    double cpu_time_used; 

    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start); 
    # do some computations 
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end); 

    cpu_time_used = (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec)/1000000000.0; 
} 
1

clock()也會如果多線程代碼存在給不是真正的執行時間。

0

如果你想測量時間,並進一步優化這些功能,以更好地使用分析工具,如oprofile那裏你會知道哪些功能需要多少時間。'opannotate'你會更好地瞭解更好方式