2012-10-05 87 views
3

我正在運行一個使用GCC和專有的DSP交叉編譯器來模擬一些函數的C程序。我使用下面的代碼來衡量我的程序的特定部分的執行時間:使用clock()來測量執行時間

clock_t start,end; 
printf("DECODING DATA:\n"); 
start=clock(); 
conv3_dec(encoded, decoded,3*length,0); 
end=clock(); 
duration = (double)(end - start)/CLOCKS_PER_SEC; 
printf("DECODING TIME = %f\n",duration); 

其中conv3_dec()是在我的程序中定義的功能,我想找到這個函數的運行時間。

現在的事情是我的程序運行時,該conv3_dec()功能運行近2小時,但來自printf("DECODING TIME = %f\n",duration)輸出說,函數的執行,在短短半秒(DECODING TIME = 0.455443)完成。這對我來說很困惑。

我已經使用clock_t技術來測量程序的運行時間,但差異從未如此巨大。這是由交叉編譯器引起的。正如旁註所示,模擬器模擬一個運行頻率僅爲500MHz的DSP處理器,因此DSP處理器和CPU的時鐘速度差異導致錯誤的原因是測量CLOCKS_PER_SEC。

回答

4

對於像兩小時這樣的持續時間,我不會太在意clock(),它對於測量亞秒的持續時間更有用。

只需使用time()如果你想實際經過的時間,像(什麼提供虛擬的東西不見了):

#include <stdio.h> 
#include <time.h> 

// Dummy stuff starts here 
#include <unistd.h> 
#define encoded 0 
#define decoded 0 
#define length 0 
static void conv3_dec (int a, int b, int c, int d) { 
    sleep (20); 
} 
// Dummy stuff ends here 

int main (void) { 
    time_t start, end, duration; 
    puts ("DECODING DATA:"); 
    start = time (0); 
    conv3_dec (encoded, decoded, 3 * length, 0); 
    end = time (0); 
    duration = end - start; 
    printf ("DECODING TIME = %d\n", duration); 
    return 0; 
} 

產生:

DECODING DATA: 
DECODING TIME = 20 
4

clock衡量cpu時間,而不是掛鐘時間。由於您沒有在cpu上運行大部分代碼,因此這不是正確的工具。

+0

我明白你的意思,但該模擬器是一個軟件模擬器,所以在本質上它是在CPU上運行....反正可以請你提出好的建議,我可以用來測量準確的運行時間......謝謝 – anshu

2

gettimeofday()功能也可以考慮。


的函數gettimeofday()函數將獲取當前時間,表示爲從epoch秒和微秒,並將其存儲在所述的timeval結構通過TP指向。系統時鐘的分辨率未指定。


Calculating elapsed time in a C program in milliseconds

http://www.ccplusplus.com/2011/11/gettimeofday-example.html

+2

根本不應該考慮getimeofday: 手冊頁說 - gettimeofday()返回的時間會受到系統時間不連續跳轉的影響(例如,如果系統管理員手動改變系統時間)。如果您需要單調遞增的時鐘,請參見clock_gettime(2)。 Opengroup說 - 應用程序應該使用clock_gettime()函數,而不是過時的gettimeofday()函數。 << – Xofo

+0

當一個國家改變其時區或打開/關閉夏令時時,系統時間也可以跳轉 –