如何计算函数的经过时间?

时间:2013-06-07 12:39:07

标签: delphi function time delphi-xe3

我想知道如何计算Delphi中函数的消耗时间。

然后我想显示使用的时间并将其与另一个功能或组件进行比较,以便了解更快的功能。

4 个答案:

答案 0 :(得分:49)

您可以使用TStopwatch单元中的System.Diagnostics来使用系统的高分辨率性能计数器测量经过的时间。

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

要以秒为单位读取时间值,例如,从时间跨度开始,请执行以下操作:

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

答案 1 :(得分:20)

您可以使用QueryPerformanceCounterQueryPerformanceFrequency功能:

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

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

答案 2 :(得分:1)

为了有更多解决问题的可能性,您还可以使用System.Classes.TThread.GetTickCount获取当前时间(以毫秒为单位)以在方法之前启动计时器,然后再使用您的方法。这两者之间的区别显然是以毫秒为单位的经过时间,您可以将其转换为小时,秒等。

话虽如此,David Heffernan对TStopwatch的建议更优雅(更准确?)。

答案 3 :(得分:0)

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;