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;

4 komentarzy

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... :)