標籤:blog http ar io os 使用 sp for strong
原文地址:http://blog.sina.com.cn/s/blog_699d3f1b01012vgb.html1 調用WIN API中的GetTickCount
[DllImport("kernel32")]
static extern uint GetTickCount();
從作業系統啟動到現在所經過的毫秒數,精度為1毫秒,經簡單測試發現其實誤差在大約在15ms左右
缺點:傳回值是uint,最大值是2的32次方,因此如果伺服器連續開機大約49天以後,該方法取得的傳回值會歸零
用法:
123 |
uint s1 = GetTickCount(); Thread.Sleep(2719); Console.WriteLine(GetTickCount() - s1); //單位毫秒 |
2 調用WIN API中的timeGetTime 推薦
[DllImport("winmm")]
static extern uint timeGetTime();
常用於多媒體定時器中,與GetTickCount類似,也是返回作業系統啟動到現在所經過的毫秒數,精度為1毫秒。
一般預設的精度不止1毫秒(不同作業系統有所不同),需要調用timeBeginPeriod與timeEndPeriod來設定精度
[DllImport("winmm")]
static extern void timeBeginPeriod(int t);
[DllImport("winmm")]
static extern void timeEndPeriod(int t);
缺點:與GetTickCount一樣,受傳回值的最大位元限制。
用法:
?
12345 |
timeBeginPeriod(1); uint start = timeGetTime(); Thread.Sleep(2719); Console.WriteLine(timeGetTime() - start); //單位毫秒 timeEndPeriod(1); |
3 調用.net內建的方法System.Environment.TickCount
擷取系統啟動後經過的毫秒數。經反編譯猜測它可能也是調用的GetTickCount,但是它的傳回值是int,而GetTickCount與 timeGetTime方法的原型中傳回值是DWORD,對應C#中的uint,難道.NET對 System.Environment.TickCount另外還做了什麼處理嗎?
缺點:與GetTickCount一樣,受傳回值的最大位元限制。
用法:
?
123 |
int aa = System.Environment.TickCount; Thread.Sleep(2719); Console.WriteLine(System.Environment.TickCount - aa); //單位毫秒 |
注:經過測試,發現GetTickCount、System.Environment.TickCount也可以用timeBeginPeriod與timeEndPeriod來設定精度,最高可將精度提高到1毫秒。不知是什麼原因?
4 調用WIN API中的QueryPerformanceCounter
[DllImport("kernel32.dll ")]
static extern bool QueryPerformanceCounter(ref long lpPerformanceCount);
用於得到高精度計時器(如果存在這樣的計時器)的值。微軟對這個API解釋就是每秒鐘某個計數器增長的數值。
如果安裝的硬體不支援高精度計時器,函數將返回false需要配合另一個API函數QueryPerformanceFrequency。
[DllImport("kernel32")]
static extern bool QueryPerformanceFrequency(ref long PerformanceFrequency);
QueryPerformanceFrequency返回硬體支援的高精度計數器的頻率,如果安裝的硬體不支援高精度計時器,函數將返回false。
用法:
?
1234567 |
long a = 0; QueryPerformanceFrequency( ref a); long b = 0, c = 0; QueryPerformanceCounter( ref b); Thread.Sleep(2719); QueryPerformanceCounter( ref c); Console.WriteLine((c - b) / ( decimal )a); //單位秒 |
精度為百萬分之一秒。而且由於是long型,所以不存在上面幾個API位元不夠的問題。
缺點:在一篇文章看到,該API在節能模式的時候結果偏慢,超頻模式的時候又偏快,而且用電池和接電源的時候效果還不一樣(筆記本)
原文地址:http://delphi.xcjc.net/viewthread.php?tid=1570
未經過超頻等測試,如果是真的,那該API出來的結果就可能不準。
5使用.net的System.Diagnostics.Stopwatch類 推薦
Stopwatch在基礎計時器機制中對計時器的刻度進行計數,從而測量已耗用時間。如果安裝的硬體和作業系統支援高解析度效能的計數器,則 Stopwatch類將使用該計數器來測量已耗用時間;否則,Stopwatch 類將使用系統計數器來測量已耗用時間。使用 Frequency 和IsHighResolution 兩個靜態欄位可以確定實現 Stopwatch 計時的精度和解析度。
實際上它裡面就是將QueryPerformanceCounter、QueryPerformanceFrequency兩個WINAPI封裝了一下,如果硬體支援高精度,就調用QueryPerformanceCounter,如果不支援就用DateTime.Ticks來計算。
用法:
Stopwatch sw =
new
Stopwatch();
sw.Start();
Thread.Sleep(2719);
sw.Stop();
Console.WriteLine(sw.ElapsedTicks / (
decimal
)Stopwatch.Frequency);
6 用 DateTime.Now.Ticks
http://www.cnblogs.com/csharp4/archive/2010/07/24/1784094.html
1個 tick 代表100納秒,1毫秒等於10000個ticks,也就是說,1秒等於 1E7 個ticks。
任何一個 DateTime 型變數中都有一個 ticks 屬性,它代表從 12:00:00 midnight, January 1, 0001 到目前時間值的間隔的 ticks 值。
用上面的方法,最精確,應該也就是精確到1tick,即100納秒。
(轉)C#精確時間計時器