2010-05-27 61 views
0

我正在使用以下代碼來計算以毫秒爲單位的執行時間。以毫微秒爲單位的執行時間和相關問題

struct timespec tp; 
if (clock_gettime (CLOCK_REALTIME, &tp) == 0) 
    return ((tp.tv_sec * 1000000000) + tp.tv_nsec); 
else 
    return ; 

您能否告訴我這是否正確? 讓我們命名這個函數comptime_nano()。

現在,我在main()中編寫以下代碼來檢查以下操作的執行時間。

unsigned long int a, b, s1, s3; 
a = (unsigned long int)(1) << 63; 
b = (unsigned long int)(1) << 63; 
btime = comptime_nano(); 
s1 = b >> 30; 
atime = comptime_nano(); 
printf ("Time =%ld for %lu\n", (atime - btime), s1); 
btime = comptime_nano(); 
s3 = a >> 1; 
atime = comptime_nano(); 
printf ("Time =%ld for %lu\n", (atime - btime), s3); 

令我驚訝的是,第一操作大約需要大約4倍的時間比第二。再一次,如果我改變這些操作的相對順序,各自的時序變化很大。

請評論...

+3

什麼,你想測量執行* single * shift所需的時間? – 2010-05-27 11:34:46

+0

+1過於苛刻以至於沒有投票,我們都是初學者。 – 2010-05-27 11:40:49

回答

3

clock_gettime不是那種計量不夠準確。如果您需要測量那樣的操作,那麼在比較之前,循環操作數千次(或數百萬次)。上面的兩個操作應該花費相同的時間量,但示例代碼中的第二個操作不具有將a,b,s1s3加載到處理器的緩存中的開銷。

此外,這裏發生了什麼?

struct timespec tp; 
if (clock_gettime (CLOCK_REALTIME, &tp) == 0) 
    return ((tp.tv_sec * 1000000000) + tp.tv_nsec); 
else 
    return ; 

第一回是非法的,如果該函數返回void,第二是非法的,如果它不返回void ....

編輯:1000000000也溢出的int範圍。

+0

你確定這個決議? Linux文檔說這個解決方案是依賴於系統的。我可以很容易地看到一個在Intel平臺上使用RDTSC的系統,以獲得CPU時鐘的恢復(應該足夠了)。此外,大整數不應該成爲問題,因爲時間值傾向於以64位整數工作。光禿禿的回報*雖然是一個問題。 – 2010-05-27 12:22:37

+0

@ T.E.D .: 1000000000是一個有符號整數。 1000000000不符合帶符號的整數。如果你想要64位文字,你需要做1000000000或1000000000。即使計時器會給你CPU時鐘的時間,但它仍然不夠準確。 CPU時鐘不顯示兩段代碼的相對性能;更多的時候,他們在這樣的代碼中只顯示緩存行爲。 – 2010-05-27 13:08:23

0

如果您的分辨率不夠好,而且您正在Intel PC上運行,請嘗試使用實時時間戳計數器(RDTSC)。我發現這個代碼在Umbutu上使用它:

#include<sys/time.h> 
#include<time.h> 
typedef unsigned long long ticks; 

static __inline__ ticks getticks(void) 
{ 
    unsigned a, d; 
    asm("cpuid"); 
    asm volatile("rdtsc" : "=a" (a), "=d" (d)); 

    return (((ticks)a) | (((ticks)d) << 32)); 
}