it-swarm.com.de

Wie berechnet man die verstrichene Zeit einer Funktion?

Ich würde gerne wissen, wie man die für eine Funktion in Delphi benötigte Zeit berechnet.

Dann wollte ich die verwendete Zeit anzeigen und mit einer anderen Funktion oder Komponente vergleichen, um die schnellere Funktion zu kennen.

14
Hidden

Mit TStopwatch aus der Einheit System.Diagnostics können Sie die verstrichene Zeit mit dem hochauflösenden Leistungsindikator des Systems messen.

var
  Stopwatch: TStopwatch;
  Elapsed: TTimeSpan;
....
Stopwatch := TStopwatch.StartNew;
DoSomething;
Elapsed := Stopwatch.Elapsed;

Gehen Sie folgendermaßen vor, um einen Zeitwert in Sekunden aus einer Zeitspanne zu lesen:

var
  Seconds: Double;
....
Seconds := Elapsed.TotalSeconds;
49
David Heffernan

Sie können die Funktionen QueryPerformanceCounter und QueryPerformanceFrequency verwenden:

var
  c1, c2, f: Int64;
begin
  QueryPerformanceFrequency(f);
  QueryPerformanceCounter(c1);
  DoSomething;
  QueryPerformanceCounter(c2);

  // Now (c2-c1)/f is the duration in secs of DoSomething
20

Um mehr Möglichkeiten zur Beantwortung der Frage zu haben, können Sie auch System.Classes.TThread.GetTickCount verwenden, um die aktuelle Zeit in Millisekunden abzurufen und den Timer vor und nach der Methode zu starten. Der Unterschied zwischen diesen beiden ist offensichtlich die verstrichene Zeit in Millisekunden, die Sie in Stunden, Sekunden usw. umwandeln können.

Davon abgesehen ist David Heffernans Vorschlag mit TStopwatch eleganter (und genauer?).

1
artnaz
VAR iFrequency, iTimerStart, iTimerEnd: Int64;

procedure TimerStart;
begin
  if NOT QueryPerformanceFrequency(iFrequency)
  then MesajWarning('High resolution timer not availalbe!');
  WinApi.Windows.QueryPerformanceCounter(iTimerStart);
end;


function TimerElapsed: Double; { In miliseconds }
begin
  QueryPerformanceCounter(iTimerEnd);
  Result:= 1000 * ((iTimerEnd - iTimerStart) / ifrequency);
end;


function TimerElapsedS: string;       { In seconds/miliseconds }
begin
 if TimerElapsed < 1000
 then Result:= Real2Str(TimerElapsed, 2)+ ' ms'
 else Result:= Real2Str(TimerElapsed / 1000, 2)+ ' s';
end;
0
Rigel