web-dev-qa-db-fra.com

Comment calculer le temps écoulé d'une fonction?

Je voudrais savoir comment calculer le temps consommé pour une fonction dans Delphi.

Ensuite, je voulais montrer le temps utilisé et le comparer à une autre fonction ou à un autre composant afin de connaître la fonction la plus rapide.

14
Hidden

Vous pouvez utiliser TStopwatch à partir de l'unité System.Diagnostics pour mesurer le temps écoulé à l'aide du compteur de performance haute résolution du système.

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

Pour lire une valeur de temps en secondes, par exemple, à partir d'une période, procédez comme suit:

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

Vous pouvez utiliser les fonctions QueryPerformanceCounter et QueryPerformanceFrequency :

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
Andreas Rejbrand

Afin d’avoir plus de possibilités de répondre à la question, vous pouvez également utiliser System.Classes.TThread.GetTickCount pour obtenir l’heure actuelle en millisecondes pour démarrer votre minuterie avant votre méthode, puis de nouveau après votre méthode. La différence entre ces deux éléments est évidemment le temps écoulé en millisecondes, que vous pouvez transformer en heures, en secondes, etc.

Cela dit, la proposition de David Heffernan avec TStopwatch est plus élégante (et plus précise?).

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