在C 中實現高效能計時2

2022-03-30 03:43:11 字數 1607 閱讀 4547

原帖及討論:

簡介精確的時間計量方法在某些應用程式中是非常重要的。常用的 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語言初學者都能做得出來,但是本篇中給出的例子實現卻更注重效率。這些例子實現的最大特點是,消除了邏輯跳轉。這樣做的好處是避免了分支 的風險,或者換句話說,可以更好地發揮處理器流水線的效能。由於本篇的問題都很簡單,筆者就...