2006年9月1日 星期五

GetTickCount() ??

最近想到.. 時間控制..
當然, 這是一個老掉牙的 TOPIC 了..
只不過, 再讓自己做多一些的參考..

一般常用只有 GetTickCount() / timeGetTime() 或 更精準的..
QueryPerformanceCounter...

今天興來看了一下其組合語言碼..
煞時才發現 GTC 的碼居然這麼短..
所以, 不能怪它不精確... Orz

[code]mov edx,7FFE0000h
mov eax,dword ptr [edx]
mul eax,dword ptr [edx+4]
shrd eax,edx,18h
ret
[/code]

反觀 tGT 卻露露長...
[code]cmp dword ptr ds:[76B30014h],0
jne 76B1C60F
call 76B12B11
sub eax,dword ptr ds:[76B30018h]
push 0
sbb edx,dword ptr ds:[76B3001Ch]
push 2710h
push edx
push eax
call 76B14E93
add eax,dword ptr ds:[76B30020h]
ret

mov edi,edi
mov edx,dword ptr ds:[7FFE000Ch]
mov eax,[7FFE0008]
cmp edx,dword ptr ds:[7FFE0010h]
jne 76B12B13
ret

push edi
push esi
push ebx
xor edi,edi
mov eax,dword ptr [esp+14h]
or eax,eax
jl 76B1AE5D
mov eax,dword ptr [esp+1Ch]
or eax,eax
jl 76B1AE76
or eax,eax
jne 76B1AE8F
mov ecx,dword ptr [esp+18h]
mov eax,dword ptr [esp+14h]
xor edx,edx
div eax,ecx
mov ebx,eax
mov eax,dword ptr [esp+10h]
div eax,ecx
mov edx,ebx
dec edi
je 76B1AED5
pop ebx
pop esi
pop edi
ret 10h
[/code]
這只有擷取其中一部份..

所以, 若只是要取一個任意值, 使用 GTC 即可..方便快速.
精確度高些使用 tGT, 當然若要再高.. 或許就要使用
QueryPerformance 這類的函式了...

參考資料..
Results of some quick research on timing in Win32