在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...