原帖及討論:
簡介精確的時間計量方法在某些應用程式中是非常重要的。常用的 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 中的高效能計時器
原帖及討論 http bbs.bccn.net thread 211272 1 1.html 簡介精確的時間計量方法在某些應用程式中是非常重要的。常用的 windows api 方法 gettickcount 返回系統啟動後經過的毫秒數。另一方面,gettickcount 函式僅有 1ms 的分辨精...
C 在高效能計算領域為什麼效能卻如此不盡人意
c 的優雅,強大ide的支援,net下各語言的二進位制相容,自從第一眼看到c 就被其良好的設計吸引。一直希望將其應用於高效能計算領域,長時間努力卻效果卻不盡如人意。對於小的測試 用例而言,c 用20 30 的效能損耗換取良好的開發維護體驗倒是非常值得。但fem cfd sph求解器的實際開發中,作為...
C語言程式設計常用數值計算的高效能實現
本篇介紹一組非常簡單卻又很常用的數值計算的巨集實現。本篇所提到的數值計算問題,相信c語言初學者都能做得出來,但是本篇中給出的例子實現卻更注重效率。這些例子實現的最大特點是,消除了邏輯跳轉。這樣做的好處是避免了分支 的風險,或者換句話說,可以更好地發揮處理器流水線的效能。由於本篇的問題都很簡單,筆者就...