易語言dll反編譯成源代碼(易語言dll文件反編譯)
根據(jù)綜合網(wǎng)上的一些文章,精確計時主要有以下幾種方式
1 調(diào)用WIN API中的GetTickCount
從操作系統(tǒng)啟動到現(xiàn)在所經(jīng)過的毫秒數(shù),精度為1毫秒,經(jīng)簡單測試發(fā)現(xiàn)其實誤差在大約在15ms左右
缺點:返回值是uint,最大值是2的32次方,因此如果服務器連續(xù)開機大約49天以后,該方法取得的返回值會歸零
用法:
2 調(diào)用WIN API中的timeGetTime 推薦
常用于多媒體定時器中,與GetTickCount類似,也是返回操作系統(tǒng)啟動到現(xiàn)在所經(jīng)過的毫秒數(shù),精度為1毫秒。
一般默認的精度不止1毫秒(不同操作系統(tǒng)有所不同),需要調(diào)用timeBeginPeriod與timeEndPeriod來設置精度
缺點:與GetTickCount一樣,受返回值的最大位數(shù)限制。
用法:
3 調(diào)用.net自帶的方法System.Environment.TickCount
獲取系統(tǒng)啟動后經(jīng)過的毫秒數(shù)。經(jīng)反編譯猜測它可能也是調(diào)用的GetTickCount,但是它的返回值是int,而GetTickCount與timeGetTime方法的原型中返回值是DWORD,對應C#中的uint,難道.NET對System.Environment.TickCount另外還做了什么處理么?
缺點:與GetTickCount一樣,受返回值的最大位數(shù)限制。
用法:
注:經(jīng)過測試,發(fā)現(xiàn)GetTickCount、System.Environment.TickCount也可以用timeBeginPeriod與timeEndPeriod來設置精度,最高可將精度提高到1毫秒。不知是什么原因?
4 調(diào)用WIN API中的QueryPerformanceCounter
用于得到高精度計時器(如果存在這樣的計時器)的值。微軟對這個API解釋就是每秒鐘某個計數(shù)器增長的數(shù)值。
如果安裝的硬件不支持高精度計時器,函數(shù)將返回false需要配合另一個API函數(shù)QueryPerformanceFrequency。
QueryPerformanceFrequency返回硬件支持的高精度計數(shù)器的頻率,如果安裝的硬件不支持高精度計時器,函數(shù)將返回false。
展開全文
用法:
longa = 0; QueryPerformanceFrequency( refa); longb = 0, c = 0; QueryPerformanceCounter( refb); Thread.Sleep( 2719); QueryPerformanceCounter( refc); Console.WriteLine((c - b) / ( decimal)a); //單位秒
精度為百萬分之一秒。而且由于是long型,所以不存在上面幾個API位數(shù)不夠的問題。
缺點:在一篇文章看到,該API在節(jié)能模式的時候結(jié)果偏慢,超頻模式的時候又偏快,而且用電池和接電源的時候效果還不一樣(筆記本)
原文地址:http://delphi.xcjc.net/viewthread.php?tid=1570
未經(jīng)過超頻等測試,如果是真的,那該API出來的結(jié)果就可能不準。
5 使用.net的System.Diagnostics.Stopwatch類 推薦
Stopwatch 在基礎計時器機制中對計時器的刻度進行計數(shù),從而測量運行時間。如果安裝的硬件和操作系統(tǒng)支持高分辨率性能的計數(shù)器,則 Stopwatch 類將使用該計數(shù)器來測量運行時間;否則,Stopwatch 類將使用系統(tǒng)計數(shù)器來測量運行時間。使用 Frequency 和 IsHighResolution 兩個靜態(tài)字段可以確定實現(xiàn) Stopwatch 計時的精度和分辨率。
實際上它里面就是將QueryPerformanceCounter、QueryPerformanceFrequency兩個WIN API封裝了一下,如果硬件支持高精度,就調(diào)用QueryPerformanceCounter,如果不支持就用DateTime.Ticks來計算。
用法:
6 使用CPU時間戳進行更高精度計時
該方法的原理我不是很明白,硬件知識太匱乏了。精度是ns
在C#中要用該方法必須先建立一個托管C++項目(因為要內(nèi)嵌匯編),編譯成DLL供c#調(diào)用,有點麻煩。
C++代碼:
// MLTimerDot.h# pragmaonce usingnamespaceSystem; namespaceMLTimerDot{ //得到計算機啟動到現(xiàn)在的時鐘周期unsigned __ int64 GetCycleCount( void) {_asm _emit 0x0F_asm _emit 0x31} //聲明 .NET 類public__gc classMLTimer{ public: MLTimer( void) {} //計算時鐘周期UInt64 GetCount( void) { returnGetCycleCount; }};}
C#調(diào)用:
longa = 0; QueryPerformanceFrequency( refa); MLTimerDot.MLTimer timer = newMLTimerDot.MLTimer; ulongss= timer.GetCount; Thread.Sleep( 2719); Console.WriteLine((timer.GetCount - ss) / ( decimal)a);
缺點:和QueryPerformanceCounter一樣,結(jié)果不太穩(wěn)定。
我的結(jié)論:常規(guī)應用下timeGetTime完全夠用了,將精度調(diào)到1毫秒,大部分境況都夠用。System.Diagnostics.Stopwatch由于調(diào)用方便,也推薦使用
來源公眾號:dotNET編程大全
版權(quán)聲明:本文來源于網(wǎng)友收集或網(wǎng)友供稿,僅供學習交流之用,如果有侵權(quán),請轉(zhuǎn)告小編或者留言,本公眾號立即刪除。
支持小薇
關(guān)注公眾號 ↑ ↑ ↑: DotNet開發(fā)跳槽 ?
點分享
點收藏
點點贊
點在看
掃描二維碼推送至手機訪問。
版權(quán)聲明:本文由飛速云SEO網(wǎng)絡優(yōu)化推廣發(fā)布,如需轉(zhuǎn)載請注明出處。