;====== Частота процессора
mov ecx,2
@@: push ecx
lfence
rdtsc
push eax
invoke Sleep,500
rdtsc
pop ebx
sub eax,ebx
mov ebx,500000
cdq
div ebx
pop ecx
dec ecx
jnz @b
mov [cpuFreq],eax ; запомнить
cinvoke printf,<10,' CPU freq..: %d MHz',0>,eax
;====== Частота таймера
invoke QueryPerformanceFrequency,qpf
mov eax,[qpf]
mov ebx,1000000
cdq
div ebx
cinvoke printf,<10,' Timer freq: %d.%d MHz',0>,eax,edx
;====== Погрешность = 2 инструкции: сериализация LFENCE, и чтение TSC
lfence
rdtsc
push eax
lfence
rdtsc
pop ebx
sub eax,ebx
mov [fix],eax ; запомнить
;***************************
; Профайлер
;***************************
lfence
rdtsc
push eax
;<----- Сюда вставляем профилируемые инструкции
lfence
rdtsc
pop ebx
sub eax,ebx
sub eax,[fix]
push eax
fild dword[esp] ; такты
fidiv [cpuFreq] ; разделить на частоту процессора
fstp [fpuBuff] ; время в нано/секундах
pop eax
cinvoke printf,<10,'%u Takt = %.3f Micro/sec',0>,\
eax, dword[fpuBuff], dword[fpuBuff+4]