{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.