Jak zmierzyć czas wykonywania operacji
Dryobates
Często pojawia się problem porównania szybkości wykonywania dwóch różnych operacji. Najczęściej stosuje się w tym celu zegar systemowy, jednak taka metoda jest mało dokładna, jeżeli potrzeba nam porównać operacje, które wykonują się bardzo szybko.
Z tego powodu Intel wprowadził w procesorach Pentium instrukcję RDTSC (Read Time Stamp Counter) podającą liczbę cykli zegara jakie upłynęły od włączenia komputera.
Można to wykorzystać do porównania dwóch operacji:
procedure Test;
//ReaD Time Stamp Counter
function RDTSC: Int64;
const
D32 = $66;
var
TimeStamp: record
case Byte of
1: (Whole: Int64);
2: (Lo, Hi: LongInt);
end;
begin
asm
rdtsc
{$ifdef Cpu386}
mov [TimeStamp.Lo], eax
mov [TimeStamp.Hi], edx
{$else}
db D32
mov word ptr TimeStamp.Lo, AX
mov [TimeStamp.Hi], eax
db D32
mov word ptr TimeStamp.Hi, DX
mov [TimeStamp.Hi], edx
{$endif}
end;
Result := TimeStamp.Whole;
end;
const
n = $FFFFFFF; //Liczba powtórzeń. Im większa tym lepsze porównanie
var
i: Integer;
czas1, czas2: Int64;
begin
czas1 := RDTSC;
for i:= 0 to n do
//Operacja do wykonania
czas2 := RDTSC;
czas2 := czas2 - czas1;
ShowMessage('Średnia liczba cykli potrzebnych na wykonanie operacji '+FloatToStr(czas2/n));
end;
nie używajcie ten niskopoziomowej metody. winapi oferuje gotowe funkcje: QueryPerformanceCounter/QueryPerformanceFrequency
Pentium, czyli oznaczenie rodziny procesorów :) Wszystkie procesory od pierwszych Pentium posiadaja tą instrukję (ja mam np. Durona i też jest).
Jeżeli piszę o konkretnym producencie to piszę, że w takich to a takich jego rozszrzeniach (3D Now! lub SSE)
No dobra a co jesli mam AMD a nie Intela?;P
Nie wiem dokładnie, jak to działa... Nie wgłębiam się w działanie procesorka... Ale w systemie windows jest chyba coś takiego jak wielowątkowość. Czy "wkroczenie" wątku w nasz proces nie pogmatwa tego??? Taki mierzony czas jest chyba RÓWNY LUB WIĘKSZY niż czas działania procesu... :)