![]() |
程式執行績效
這裡用到 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) 至於這個結果能做什麼? ...待續 ^^ |
在講應用前再補充一些
'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 |
接著是實例
舉個簡單的 VB 裡有 IF Then Else Select Case Choose 又判斷式 可分 >、=、<、Not、True、False、1、"1" 此時為了程式效率 因如何做抉擇呢? 就可利用上面的 式子 至於 IF Then Else、Select Case、Choose 各有千秋 第二次運算通常比第一次快 所以就不貼出個人試驗結果了 希望大家聽的懂 ^^ |
所有時間均為台北時間。現在的時間是 02:45 PM。 |
Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2025, Jelsoft Enterprises Ltd.
『服務條款』
* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *