史萊姆論壇

返回   史萊姆論壇 > 專業主討論區 > 程式語言討論區
忘記密碼?
論壇說明 標記討論區已讀

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


發文 回覆
 
主題工具 顯示模式
舊 2005-06-29, 11:54 AM   #1
mini
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:97 | 在線時長:9834小時 | 升級還需:162小時級別:97 | 在線時長:9834小時 | 升級還需:162小時級別:97 | 在線時長:9834小時 | 升級還需:162小時級別:97 | 在線時長:9834小時 | 升級還需:162小時級別:97 | 在線時長:9834小時 | 升級還需:162小時級別:97 | 在線時長:9834小時 | 升級還需:162小時級別:97 | 在線時長:9834小時 | 升級還需:162小時
註冊日期: 2002-12-07
文章: 13335
精華: 0
現金: 26432 金幣
資產: 3024292 金幣
預設 程式執行績效

這裡用到 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 目前離線  
送花文章: 2011, 收花文章: 7996 篇, 收花: 26798 次
回覆時引用此帖
舊 2005-06-29, 02:34 PM   #2 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:97 | 在線時長:9834小時 | 升級還需:162小時級別:97 | 在線時長:9834小時 | 升級還需:162小時級別:97 | 在線時長:9834小時 | 升級還需:162小時級別:97 | 在線時長:9834小時 | 升級還需:162小時級別:97 | 在線時長:9834小時 | 升級還需:162小時級別:97 | 在線時長:9834小時 | 升級還需:162小時級別:97 | 在線時長:9834小時 | 升級還需:162小時
註冊日期: 2002-12-07
文章: 13335
精華: 0
現金: 26432 金幣
資產: 3024292 金幣
預設

在講應用前再補充一些

'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 目前離線  
送花文章: 2011, 收花文章: 7996 篇, 收花: 26798 次
回覆時引用此帖
舊 2005-07-01, 09:24 AM   #3 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:97 | 在線時長:9834小時 | 升級還需:162小時級別:97 | 在線時長:9834小時 | 升級還需:162小時級別:97 | 在線時長:9834小時 | 升級還需:162小時級別:97 | 在線時長:9834小時 | 升級還需:162小時級別:97 | 在線時長:9834小時 | 升級還需:162小時級別:97 | 在線時長:9834小時 | 升級還需:162小時級別:97 | 在線時長:9834小時 | 升級還需:162小時
註冊日期: 2002-12-07
文章: 13335
精華: 0
現金: 26432 金幣
資產: 3024292 金幣
預設

接著是實例
舉個簡單的

VB 裡有

IF Then Else
Select Case
Choose

又判斷式 可分 >、=、<、Not、True、False、1、"1"
此時為了程式效率
因如何做抉擇呢?

就可利用上面的 式子
至於 IF Then Else、Select Case、Choose
各有千秋
第二次運算通常比第一次快
所以就不貼出個人試驗結果了

希望大家聽的懂 ^^
mini 目前離線  
送花文章: 2011, 收花文章: 7996 篇, 收花: 26798 次
回覆時引用此帖
發文 回覆


主題工具
顯示模式

發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 09:55 PM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1