Dosenware hat geschrieben:Habe ich schon mit anderen funktionen getestet: immer das gleiche Ergebnis: die Funktion die zuerst definiert wurde, ist am langsamsten, egal von wo aus sie Aufgerufen wird.
Und das ganze Testprogramm (nur zum Routinenbenchen) passt locker in den L1 des 486er.
So, das hat jetzt Zeit gekostet
hier erstmal das Testprogramm:
Code: Alles auswählen
{$A+,B+,D+,E+,F-,G+,I+,L+,N-,O-,P-,Q+,R+,S+,T-,V+,X+,Y+}
{$M 16384,0,655360}
uses dos;
var v : word;
i : longint;
hStart, mStart, sStart, hsStart,
hEnde, mEnde, sEnde, hsEnde : array[1..2] of longint;
{ *** macht aus Integer einen String *** }
function txt( wert:longint ) : string;
var stri:string;
begin
Str(wert,stri);
txt:=stri;
end;
procedure StartZeitmessung( Nr:word );
begin
gettime(Word(hStart[Nr]),Word(mStart[Nr]),Word(sStart[Nr]), word(hsStart[Nr]) );
end;
procedure StopZeit( Nr:word );
begin
gettime(Word(hEnde[Nr]),Word(mEnde[Nr]),Word(sEnde[Nr]),Word(hsEnde[Nr]));
end;
function ZeitStr( Nr:Word ):string; { in Hsec }
var Zeitdauer : longint;
dstr : string;
begin
{$Q-}
zeitdauer:=longint(longint(hEnde[Nr]-hStart[Nr])*360000+
longint(mEnde[Nr]-mStart[Nr])*6000+
longint(sEnde[Nr]-sStart[Nr])*100+
hsEnde[Nr]-hsStart[Nr]);
{$Q+}
dStr := txt(Zeitdauer div 100);
if Zeitdauer mod 100 < 10 then
ZeitStr := dStr + '.0'+txt(Zeitdauer mod 100) + ' sec'
else
ZeitStr := dStr + '.' +txt(Zeitdauer mod 100) + ' sec';
end;
function b : word;
begin
b := Round( v*v*v* 0.96 );
end;
function a : word;
begin
a := 100*v;
end;
begin
v := 12;
StartZeitMessung(1);
for i := 1 to 1000000 do a;
StopZeit(1);
StartZeitmessung(2);
for i := 1 to 1000000 do b;
StopZeit(2);
writeln( 'Zeitdauer 1. Funktion: ', ZeitStr(1) );
writeln( 'Zeitdauer 2. Funktion: ', ZeitStr(2) );
readln;
end.
Testplattform: 386sx16 (ohne Caches etc.)
Anzahl der Versuche: 20 (!)
Ergebnis:
Function a 15.05-15.16 sec
Function b 88.70-90.63 sec
Dabei war egal, ob function a vor function b definiert war. Es war auch egal, ob eine Funktion irgendwo anders, d.h. z.B. oberhalb der Hilfsprocedures wie StartZeitmessung o.ä. definiert war.
Ich hatte zwar am Anfang eine Häufung dafür, dass eine Konstellation schneller schien. Das hat sich aber nach 20 Versuchen gelegt. Ich hatte in jeder Konstellation mind. einmal das Extremum von 90.63 sec. Function a blieb im Übrigen ziemich konstant bei 15.15 sec. Die Werte 15.06 und 15.16 hatte ich nur je einmal.
Ergebnis: Gettime ruft m.W. eine Dosfunktion auf und ist ziemlich ungenau. Am Anfang hatte ich z.B. die Funktionsaufrufe um den Faktor 10 seltener aufgerufen. Da war dann teilweise Funktion b schneller als Funktion a, obwohl das nicht sein kann.
Benchmarking mache ich deswegen immer über den Timer-Interrupt, was auch nicht viel schwieriger ist. Aber hoffentlich ein bisschen genauer... GetTime verwendet man wohl eher, wenn man nur die aktuelle Uhrzeit (Stunde:Minute) wissen will, nicht für's Timing