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.
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;
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
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?).
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;