C C 計時函式比較

2021-08-11 04:41:08 字數 3136 閱讀 8536

來自:

目前,存在著各種計時函式,一般的處理都是先呼叫計時函式,記下當前時間tstart,然後處理一段程式,再呼叫計時函式,記下處理後的時間tend,再tend和tstart做差,就可以得到程式的執行時間,但是各種計時函式的精度不一樣.下面對各種計時函式,做些簡單記錄.

方法1,time()獲取當前的系統時間,返回的結果是乙個time_t型別,其實就是乙個大整數,其值表示從cut(coordinated universal time)時間2023年1月1日00:00:00(稱為unix系統的epoch時間)到當前時刻的秒數.   

void test1()

方法2,clock()函式返回從「開啟這個程式程序」到「程式中呼叫clock()函式」時之間的cpu時鐘計時單元(clock tick)數,在msdn中稱之為掛鐘時間(wal-clock)

常量clocks_per_sec,它用來表示一秒鐘會有多少個時鐘計時單元

void test2()

方法3,timegettime()函式以毫秒計的系統時間。該時間為從系統開啟算起所經過的時間,是windows api

void test3()

方法4,queryperformancecounter()這個函式返回高精確度效能計數器的值,它可以以微妙為單位計時.但是queryperformancecounter()確切的精確計時的最小單位是與系統有關的,所以,必須要查詢系統以得到queryperformancecounter()返回的嘀噠聲的頻率.queryperformancefrequency()提供了這個頻率值,返回每秒嘀噠聲的個數.

void test4()

方法5,gettickcount返回(retrieve)從作業系統啟動到現在所經過(elapsed)的毫秒數,它的返回值是dword

void test5()

方法6,rdtsc指令,在intel   pentium以上級別的cpu中,有乙個稱為「時間戳(time   stamp)」的部件,它以64位無符號整型數的格式,記錄了自cpu上電以來所經過的時鐘週期數。由於目前的cpu主頻都非常高,因此這個部件可以達到納秒級的計時精度。這個精確性是上述幾種方法所無法比擬的.在pentium以上的cpu中,提供了一條機器指令rdtsc(read   time   stamp   counter)來讀取這個時間戳的數字,並將其儲存在edx:eax暫存器對中。由於edx:eax暫存器對恰好是win32平台下c++語言儲存函式返回值的暫存器,所以我們可以把這條指令看成是乙個普通的函式呼叫,因為rdtsc不被c++的內嵌彙編器直接支援,所以我們要用_emit偽指令直接嵌入該指令的機器碼形式0x0f、0x31

inline unsigned __int64 getcyclecount()

}void test6()

方法7,gettimeofday() linux環境下的計時函式,int gettimeofday ( struct timeval * tv , struct timezone * tz ),gettimeofday()會把目前的時間有tv所指的結構返回,當地時區的資訊則放到tz所指的結構中.

//

timeval結構定義為:

struct timeval;

//timezone 結構定義為:

struct timezone;

void test7()

方法8,linux環境下,用rdtsc指令計時.與方法6是一樣的.只不過在linux實現方式有點差異.

#if defined (__i386__)

static __inline__ unsigned long

long getcyclecount(void)

#elif defined (__x86_64__)

static __inline__ unsigned long

long getcyclecount(void)

#endif

void test8()

簡單的比較**如下

序號函式

型別精度級別時間1

time

c系統呼叫

低<1s

2clcok

c系統呼叫

低<10ms

3timegettime

windows api

中<1ms

4queryperformancecounter

windows api

高<0.1ms

5gettickcount

windows api

中<1ms

6rdtsc指令高

<0.1ms

7gettimeofday 

linux環境下c系統呼叫

高<0.1ms

總結,方法1,2,7,8可以在linux環境下執行,方法1,2,3,4,5,6可以在windows環境下執行.其中,timegettime()和gettickcount()的返回值型別為dword,當統計的毫妙數過大時,將會使結果歸0,影響統計結果.

測試結果,windows環境下,主頻為1.6ghz,單位為秒.

1 use time:0

2 use time:0.390000

3 use time:0.388000

4 use time:0.394704

5 use time:0.407000

6 use time:0.398684

linux環境下,主頻為2.67ghz,單位為秒

1 use time:1

2 use time:0.290000

7 use time:0.288476

8 use time:0.297843

由於time()計時函式的精度比較低,多次執行程式時,將會得到不同的結果,時而為0,時而為1

foo()函式如下:

void foo()

}

C C 計時函式比較

參考 c c 計時函式比較 目前,存在著各種計時函式,一般的處理都是先呼叫計時函式,記下當前時間tstart,然後處理一段程式,再呼叫計時函式,記下處理後的時間tend,再tend和tstart做差,就可以得到程式的執行時間,但是各種計時函式的精度不一樣.下面對各種計時函式,做些簡單記錄.方法1,t...

C C 計時函式彙總

c c 計時函式比較 目前,存在著各種計時函式,一般的處理都是先呼叫計時函式,記下當前時間tstart,然後處理一段程式,再呼叫計時函式,記下處理後的時間tend,再tend和tstart做差,就可以得到程式的執行時間,但是各種計時函式的精度不一樣.下面對各種計時函式,做些簡單記錄.方法1,time...

C C 各種計時函式

對windows平台下常用的計時函式進行總結,包括精度為秒 毫秒 微秒三種精度的5 種方法。分為在標準c c 下的二種time 及clock 標準c c 所以使用的time 及clock 不僅可以用在windows 系統,也可以用於linux系統。在windows系統下三種,使用windows提供的...