關於高精度計時器
一、毫秒級精度
1、[.net]system.environment.tickcount
獲取系統啟動後經過的毫秒數,包裝了gettickcount
2、[winapi]gettickcount
[dllimport("kernel32")]
static extern uint gettickcount();
從作業系統啟動到現在所經過的毫秒數,精度為1毫秒,經簡單測試發現其實誤差在大約在15ms左右
3、[winapi]timegettime
[dllimport("winmm")]
static extern uint timegettime();
常用於多**定時器中,與gettickcount類似,也是返回作業系統啟動到現在所經過的毫秒數,最高精度為1毫秒。一般預設的精度不止1毫秒(在nt系統上據說預設精度為10ms,但是可以用timebeginperiod來降低到1ms),需要呼叫timebeginperiod與timeendperiod來設定精度
二、微秒級精度
1、[.net]system.diagnostics.stopwatch
實際上它裡面就是將queryperformancecounter、queryperformancefrequency兩個win api封裝了一下,如果硬體支援高精度,就呼叫queryperformancecounter,如果不支援就用datetime.ticks來計算。
2、[winapi]queryperformancecounter、queryperformancefrequency
[dllimport("kernel32.dll ")]
static extern bool queryperformancecounter(ref long tick);
[dllimport("kernel32.dll ")]
static extern bool queryperformancefrequency(ref long tick);
queryperformancecounter用於得到高精度計時器(如果存在這樣的計時器)的值。如果安裝的硬體不支援高精度計時器,函式將返回false。
queryperformancefrequency返回硬體支援的高精度計數器的頻率,如果安裝的硬體不支援高精度計時器,函式將返回false。
但是據說該api在節能模式的時候結果偏慢,超頻模式的時候又偏快,而且用電池和接電源的時候效果還不一樣(筆記本)。沒有測試過。
二、納秒級精度
[asm]rdtsc
機器碼:0x0f, 0x31
c++中使用方法:
inline __declspec(naked) unsigned long tick()
c#中使用方法(c#中內聯彙編):
static class helper
;//rdtsc, ret的機器碼
static helper()
public static ulong tick
}}
呼叫:helper.tick
這個指令在超執行緒和多核cpu上用來計算時間不是很準確
1 根據intel的介紹,由於在現代的處理器中都具有指令亂序執行的功能,因此在有些情況下rdtsc指令並不能很好的反映真實情況。解決方法是,在rdtsc之前加一些cpuid指令,使得rdtsc後面的指令順序執行。
2 另外,rdtsc是一條慢啟動的指令,第一次執行需要比較長的啟動時間,而第二次之後時間就比較短了,也就是說,這條指令在第一次工作時需要比較長的時鐘週期,之後就會比較短了。所以可以多執行幾次,避過第一次的消耗。
3 大家在測試某乙個函式的cpu週期的時候,如果精度要求很高,需要減去rdtsc的週期消耗。我在至強2.6g上測試的結果是大約500多個時鐘週期,我想這是應該考慮在內的,很多小的函式也就是幾k個時鐘週期。
4 一定要注意cache的影響。如果你在對同一組資料進行操作,第一次操作往往要比後面幾次時間開銷大,原因就在於cache的快取功能,而這一部分是不可見的。
Windows Linux高精度計時器 C
linux windows 系統高精度計時器 ifndef lx timer h define lx timer h ifdef win32 include elif linux include endif class lxtimer endif include lxtimer.h ifdef wi...
高精度納秒計時器
ktimer.h windows graphics programming win32 gdi and directdraw?feng yuan publisher prentice hall ptr first edition december 01,2000 高精度納秒計時器,最後修改 2008...
基於c 11 的高精度計時器
c 11 增加了用於處理時間的標準庫,於是便可以很方便的實現乙個程式計時器,用於測量某段 執行所使用的時間。ifndef timer h define timer h include include namespace kedixa void start void pause void stop s...