C 中的高效能計時器

2021-04-21 08:20:09 字數 1627 閱讀 7601

原帖及討論:http://bbs.bccn.net/thread-211272-1-1.html

簡介精確的時間計量方法在某些應用程式中是非常重要的。常用的 windows api 方法 gettickcount() 返回系統啟動後經過的毫秒數。另一方面,gettickcount() 函式僅有 1ms 的分辨精度,很不精確。

故而,我們要另外尋找一種方法來精確測量時間。

win32 api 使用 queryperformancecounter() 和 queryperformancefrequency() 方法支援高精度計時。這些方法,比「標準的」毫秒精度的計時方法如 gettickcount() 之類有高得多的精度。另一方面來說,在 c# 中使用「非託管」的 api 函式會有一定的開銷,但比起使用一點都不精確的 gettickcount() api 函式來說要好得多了。

第乙個函式 queryperformancecounter() 查詢任意時刻高精度計數器的實際值。第二個函式 queryperformancefrequency() 返回高精度計數器每秒的計數值。為了獲得某一**段經歷的時間,你需要獲得**段開始前和結束後這兩個計時時刻的高精度計數器實際值。這兩個值的差指出了**段執行所經歷的時間。

然後通過將差除以每秒計數值(高精度計時器頻率),就可以計算經過的時間了。

duration = (stop - start) / frequency

經過時間 = (停止時間 - 開始時間) / 頻率

需要關於 queryperformancecounter 和 queryperformancefrequency 的更多資訊,請參閱 msdn 文件。

**下面的類實現了 queryperformancecounter() 和 queryperformancefrequency() api 函式的功能。

using system;

using system.runtime.interopservices;

using system.componentmodel;

using system.threading;

namespace win32

}// 開始計時器

public void start()

// 停止計時器

public void stop()

// 返回計時器經過時間(單位:秒)

public double duration}}

}使用這個類很簡單。只需要建立乙個 hiperftimer 的例項,然後呼叫 start() 開始計時,stop() 停止計時。要獲得經過的時間,呼叫 duration() 函式即可。

參考下面的例子。

hiperftimer pt = new hiperftimer();     // 建立新的 hiperftimer 物件

pt.start();                             // 啟動計時器

console.writeline("test/n");            // 需要計時的**

pt.stop();                              // 停止計時器

console.writeline("duration: sec/n",

pt.duration); // 列印需要計時部分**的用時

C 簡單計時器

因為經常需要對 段計時,如下是乙個抽象的計時器類,包含兩個類乙個是timer類,用於計時操作,在需要計時的 段開始處呼叫start 開始計時,在 段結尾處呼叫stop 停止計時,elapse 可以獲取 段的耗時。另乙個是time ctory類用於timer的管理呼叫gettimer 即可獲取乙個計時...

C 計時器寫法

剛才乙個 裡有人問計時器怎麼寫,正好我也不太熟,就寫了個demo,和大家分享一下這個是參考師傅的寫的!計時器有好多種寫法,這裡給大家推薦乙個效能比較好的,用dispatchertimer做的,本demo是倒計時的,計時的將 seconds 改成 就可以了。不多說了,直接上 1.這是介面,簡單的xam...

iOS中的計時器

ios中定時器有三種,分別是nstimer cadisplaylink dispatch source,下面就分別對這三種計時器進行說明 一 nstimer 建立方法 1 nstimer timer nstimer scheduledtimerwithtimeinterval 1.0 target ...