|
論壇說明 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2005-06-29, 11:54 AM | #1 |
管理版主
|
程式執行績效
這裡用到 WinAPI 函數
以下是 VB 宣告 Public Declare Function GetTickCount Lib "kernel32" () As Long 作用是 "計算Windows從啟動後所運行的總時間" 單位是1豪秒 (1ms) 1s = 1000ms = 1000000μs = 1000000000ns 接著是實作 假設我們要得知 S() 函數(指令、運算) 所要花費的時間 Function ReviseTimerTickNum(Optional ByRef ReviseTimerTickMilliSec As Long) As Long Dim LongTick As Long LongTick = GetTickCount Do Call S() DoEvents ReviseTimerTickNum = ReviseTimerTickNum + 1 ReviseTimerTickMilliSec = GetTickCount - LongTick Loop Until ReviseTimerTickMilliSec > 0 End Function '得知做多少次(S+DoEvents)會多 ReviseTimerTickMilliSec 豪秒 '得知多 ReviseTimerTickMilliSec 豪秒需做ReviseTimerTickNum次 注意 ReviseTimerTickMilliSec 通常會大於 1 (從1.xx~x.xx) 至於這個結果能做什麼? ...待續 ^^ |
送花文章: 2013,
|
2005-06-29, 02:34 PM | #2 (permalink) |
管理版主
|
在講應用前再補充一些
'GetTickCount() 'Windows NT 3.5 及更高版本,精度為 10ms 'Windows NT 3.1 及更高版本,精度為 16ms 'Windows 95 及更高版本,精度為 55ms 'timeGetTime() '精度約1ms , 此式適用於大多數應用場合 Public Declare Function timeGetTime Lib "winmm.dll" () As Long '1s = 1000ms = 1000000μs = 1000000000ns 那微秒級數的呢? '得到處理器使用的主機板內部計時器的時鐘頻率 Private Declare Function QueryPerformanceFrequency Lib "kernel32" ( _ lpFrequency As Currency) As Long 'LARGE_INTEGER Private Declare Function QueryPerformanceCounter Lib "kernel32" ( _ lpPerformanceCount As Currency) As Long 'LARGE_INTEGER 原本QueryPerformanceFrequency 和 QueryPerformanceCounter 的參數之資料型態是 LARGE_INTEGER Type LARGE_INTEGER '佔 8 byte lowpart As Long highpart As Long End Type 因為要簡省換算是改成同樣是 8byte 的 Currency(for VB,C 的話可用 LONGLONG) ================= timeGetTime 的實例同第一例子 所以這裡示範 高精度(微秒) if not GetTickCount_MicroSec(True) then MsgBox "不支持高精度計數器!" else Do Call S() DoEvents ReviseTimerTickMicroSec = GetTickCount_MicroSec Loop Until ReviseTimerTickMicroSec > 1000 '1000us=1ms endif ..... Public Function GetTickCount_MicroSec(Optional ByRef blnCountStart As Boolean) Static TickCount1 As Currency Dim TickCount2 As Currency Dim Freq As Currency If QueryPerformanceFrequency(Freq) Then If blnCountStart Then QueryPerformanceCounter TickCount1 GetTickCount_MicroSec = True Else QueryPerformanceCounter TickCount2 GetTickCount_MicroSec = (Abs(TickCount2 - TickCount1) / Freq) * 1000000 '10^6 End If Else 'MsgBox "不支持高精度計數器!" GetTickCount_MicroSec = False End If End Function |
送花文章: 2013,
|