C 微秒級計時器實現

2021-10-04 22:49:24 字數 2373 閱讀 9922

在windows平台上,用來統計微秒級別耗時資訊,需要用到兩個windows api:

bool winapi queryperformancefrequency

( _out_ large_integer *lpfrequency);

bool winapi queryperformancecounter

( _out_ large_integer *lpperformancecount

);

queryperformancefrequency用於獲取效能計數的頻率,每秒多少次,

queryperformancecounter用於獲取當前效能計數的值,

有了這兩個api,我們就可以用來統計耗時了,思路如下:

那麼如何得到最終的耗時呢,公式如下:

秒級耗時 = (結束效能計數值 - 開始效能計數值) / 效能計數頻率

微秒耗時 = (結束效能計數值 - 開始效能計數值)* 1000000 / 效能計數頻率

#include

large_integer freq_;

queryperformancefrequency

(&freq_)

;large_integer begin_time;

large_integer end_time;

queryperformancecounter

(&begin_time)

;sleep

(100);

queryperformancecounter

(&end_time)

;double ns_time =

(end_time.quadpart - begin_time.quadpart)

*1000000.0

/ freq_.quadpart;

此時,ns_time的精度為微秒。

雖然上面已經實現了微秒精度計時,但是由於每次呼叫api時,都要定義變數等,使用起來肯定會有很多重複或者類似的**,那麼為了避免這種情況,對此實現進行了封裝,如下:

class

stop_watch

~stop_watch()

public

:void

start()

void

stop()

void

restart()

//微秒

double

elapsed()

//毫秒

double

elapsed_ms()

//秒double

elapsed_second()

private

: large_integer freq_;

large_integer begin_time_;

long

long elapsed_;

};

呼叫此封裝類示例:

stop_watch watch;

watch.

start()

;sleep

(100);

watch.

stop()

;cout << watch.

elapsed()

<<

" ns"

<< endl;

類似於 c++利用 clock()函式進行計時的呼叫方法,但比clock()函式計時精度更高。

clock()函式返回值為1毫秒,就是0.001秒。

功 能: 返回處理器呼叫某個程序或函式所花費的時間。

用 法: clock_t clock(void);

說明:clock_t其實就是long,即長整形。該函式返回值是硬體滴答數,要換算成秒或者毫秒,需要除以clk_tck或者clocks_per_sec。比如,在vc++6.0下,這兩個量的值都是1000,這表示硬體滴答1000下是1秒,因此要計算乙個程序的時間,用clock()除以1000即可。

start =

clock()

;quicksort

(d,num)

; stop =

clock()

; duration =

(double

)(stop-start)

/(clocks_per_sec)

;

注意:本函式僅能返回ms級的計時精度(事實上能夠達到的計時精度大致與作業系統的執行緒切換時間相當,在windows平台上,極限精度大致是15~16ms)。

c 微秒級計時器

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

c納秒級計時器 C 11 計時器!真香

在我們寫程式過程中,有時候需要測試我們的程式語句執行時間的耗時,當前也是有很多的庫提供我們去使用,一直沒有良好的跨平台的庫可以提供出來 而且一般這種 也是由我們程式設計師自己呼叫系統的庫來進行,但是往往會出現精度不足和不支援跨平台等問題 他來了。他來了。他踩著七彩祥雲來了 他 就是c 11中引進bo...

c 實現計時器功能

在低液位預警彈窗點選確定後需要實現乙個計時器,比如在五分鐘後再執行監控。實現思路是使用timer然後每秒執行乙個方法,在方法中對秒數進行減1操作,等倒計時結束後執行相應的操作。但是timer有三個 1.定義在system.windows.forms裡 2.定義在system.threading.ti...