Как рассчитать прошедшее время функции?

Я хотел бы знать, как рассчитать время, затрачиваемое на функцию в Delphi.

Затем я хотел показать использованное время и сравнить его с другой функцией или компонентом, чтобы узнать более быструю функцию.

Ответ 1

Вы можете использовать TStopwatch из блока System.Diagnostics для измерения прошедшего времени с помощью счетчика производительности с высоким разрешением системы.

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

Чтобы прочитать значение времени в секундах, скажем, из временного интервала, сделайте следующее:

var
  Seconds: Double;
....
Seconds := Elapsed.TotalSeconds;

Ответ 2

Вы можете использовать функции QueryPerformanceCounter и 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

Ответ 3

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;

Ответ 4

Чтобы иметь больше возможностей для решения вопроса, вы также можете использовать System.Classes.TThread.GetTickCount, чтобы получить текущее время в миллисекундах, чтобы запустить ваш таймер перед вашим методом, а затем снова после вашего метода. Разница между этими двумя - это, очевидно, истекшее время в миллисекундах, которое вы могли бы преобразовать в часы, секунды и т.д.

Сказав это, предложение Дэвида Хеффернана с TStopwatch более элегантно (и точнее?).