史萊姆論壇

史萊姆論壇 (http://forum.slime.com.tw/)
-   程式語言討論區 (http://forum.slime.com.tw/f76.html)
-   -   程式執行績效 (http://forum.slime.com.tw/thread152461.html)

mini 2005-06-29 11:54 AM

程式執行績效
 
這裡用到 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)

至於這個結果能做什麼?

...待續 ^^

mini 2005-06-29 02:34 PM

在講應用前再補充一些

'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

mini 2005-07-01 09:24 AM

接著是實例
舉個簡單的

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.

『服務條款』

* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *


SEO by vBSEO 3.6.1