Einzelnen Beitrag anzeigen

Horst_

Registriert seit: 22. Jul 2004
Ort: Münster Osnabrück
116 Beiträge
 
#11

Re: cpu zeit einer schleife auslesen

  Alt 5. Jun 2008, 21:41
Hallo,

etwas genauer, zählt Takte
Man kann auch CPUF bestimmen, aber bei Cool&quite und Konsorten etwas schwieriger..

Bei´m PentiumM
Startaufruf ~54 Takte
StoppAufruf ~56 Takte (Obwohl viel mehr gerechnet wird)
Delphi-Quellcode:
{APPTYPE Console}
uses
  sysutils;

const
  CPUF = 1700000;//CPU frequenz in khz

type
  tZeit = record
            t0, //letzter Start
            t1, //letzter Stopp
            dt, // Differenz Stopp-Start
            tsum, //Summe aller Differenzen
            StartStoppCnt : int64; //Anzahl Aufrufe
          end;
var
  tges,tdummy : tZeit;
  i : integer;
  j : int64;

procedure ZeitInit(var t:tZeit);
begin
  with t do
    begin
    t0:=0;
    t1:=0;
    dt:=0;
    tsum:=0;
    StartStoppCnt := 0;
    end;
end;

procedure ZeitStart(var t:tZeit);ASSEMBler;

asm
  // EAX ist der Zeiger auf t und muss gerettet werden
  // Weil der Compiler sonst durcheinander kommt
  MOV ECX,EAX
  rdtsc
  Xchg EAX,ECX
  mov Dword Ptr [t.t0], ecx
  mov Dword Ptr [t.t0+4], edx
end;

procedure ZeitStopp(var t:tZeit);Assembler;
asm
  // EAX ist der Zeiger auf t und muss gerettet werden
  // Weil der Compiler sonst durcheinander kommt
  MOV ECX,EAX
  rdtsc;
  Xchg EAX,ECX
  //Zeit in tStopp speichern
  mov Dword Ptr [t.t1], ecx
  mov Dword Ptr [t.t1+4], edx
  //dt bestimmen
  SUB ecx,Dword Ptr [t.t0]
  SBB edx,Dword Ptr [t.t0+4]
  mov Dword Ptr [t.dt], ecx
  mov Dword Ptr [t.dt+4], edx
  //tsum berechnen
  ADD ecx,Dword Ptr [t.tsum]
  ADC edx,Dword Ptr [t.tsum+4]
  MOV Dword Ptr [t.tsum],EcX
  MOV Dword Ptr [t.tsum+4],EDX
  //Cnt erhöhen Achtung nur 32 bit genutzt
  INC Dword Ptr [t.StartStoppCnt]
end;

begin
  ZeitInit(tGes);
  ZeitStart(tges);
   for i := 1 to 1000000 do
    j := sqr(i);
  ZeitStopp(tges);
  WriteLn(Format(' Gesamttakte %12d ',[tges.tsum]));
  WriteLn(Format(' Gesamtzeit %12.6f ms',[tges.tsum/CPUf]));
  WriteLn(Format(' Gesamtzahl %12d ',[tges.StartStoppCnt]));
  Writeln;

  //Wird länger dauern wegen des Overhead's
  //Bei mir 56 Takte pro Durchlauf
  ZeitInit(tGes);
  ZeitInit(tDummy);
  ZeitStart(tges);
  for i := 1 to 1000000 do
     begin
     ZeitStart(tDummy);
     end;
  ZeitStopp(tges);

  WriteLn(Format(' Gesamttakte %12d ',[tges.tsum]));
  WriteLn(Format(' Gesamtzeit %12.6f ms',[tges.tsum/CPUf]));
  WriteLn(Format(' Gesamtzahl %12d ',[tdummy.StartStoppCnt]));
  Writeln;

  //Bei mir 58 Takte pro Durchlauf
  ZeitInit(tGes);
  ZeitInit(tDummy);
  ZeitStart(tges);
  for i := 1 to 1000000 do
     begin
     ZeitStopp(tdummy);
     end;
  ZeitStopp(tges);
  WriteLn(Format(' Gesamttakte %12d ',[tges.tsum]));
  WriteLn(Format(' Gesamtzeit %12.6f ms',[tges.tsum/CPUf]));
  WriteLn(Format(' Gesamtzahl %12d ',[tdummy.StartStoppCnt]));
  Writeln;
end.
Gruß Horst
  Mit Zitat antworten Zitat