在没有 `free` 的情况下使用 `TStopWatch`
Using `TStopWatch` without `free`
我在 Delphi 10.2 东京使用 TStopWatch
进行高精度计时。
这个网站:https://www.thoughtco.com/accurately-measure-elapsed-time-1058453给出了下面的例子:
var
sw : TStopWatch;
elapsedMilliseconds : cardinal;
begin
sw := TStopWatch.Create() ;
try
sw.Start;
//TimeOutThisFunction()
sw.Stop;
elapsedMilliseconds := sw.ElapsedMilliseconds;
finally
sw.Free;
end;
end;
显然,这里有一个错误,因为:
StopWatch
不包含Free
- Delphi 文档明确指出:
TStopwatch
is not a class but still requires explicit initialization
[using StartNew
or Create
methods].
这令人困惑。我在一个函数中使用 TStopWatch
,我没有使用 free
。在每个会话期间可能会多次调用此函数(可能数百次,具体取决于使用情况)。这意味着 TStopWatch
的多个实例将被创建,而不被释放。
是否存在内存泄漏或其他并发症的可能性?如果答案是肯定的,我该怎么办?每个应用程序是否只需要创建一个 TStopWatch
实例?还是我应该使用其他功能?或者别的什么?
链接示例是基于 class 的 TStopWatch
。
unit StopWatch;
interface
uses
Windows, SysUtils, DateUtils;
type
TStopWatch = class
...
它是在 Delphi 引入基于 TStopWatch
的记录之前发布的。
由于class变体在使用后需要调用Free
,而record based则不需要,所以这里没有混淆。
只需继续使用基于 Delphi 记录的 TStopWatch
,无需在使用后释放它。
通常我使用以下模式:
var
sw : TStopWatch;
begin
sw := TStopWatch.StartNew;
... // Do something
sw.Stop;
// Read the timing
WriteLn(sw.ElapsedMilliseconds);
我在 Delphi 10.2 东京使用 TStopWatch
进行高精度计时。
这个网站:https://www.thoughtco.com/accurately-measure-elapsed-time-1058453给出了下面的例子:
var
sw : TStopWatch;
elapsedMilliseconds : cardinal;
begin
sw := TStopWatch.Create() ;
try
sw.Start;
//TimeOutThisFunction()
sw.Stop;
elapsedMilliseconds := sw.ElapsedMilliseconds;
finally
sw.Free;
end;
end;
显然,这里有一个错误,因为:
StopWatch
不包含Free
- Delphi 文档明确指出:
TStopwatch
is not a class but still requires explicit initialization [usingStartNew
orCreate
methods].
这令人困惑。我在一个函数中使用 TStopWatch
,我没有使用 free
。在每个会话期间可能会多次调用此函数(可能数百次,具体取决于使用情况)。这意味着 TStopWatch
的多个实例将被创建,而不被释放。
是否存在内存泄漏或其他并发症的可能性?如果答案是肯定的,我该怎么办?每个应用程序是否只需要创建一个 TStopWatch
实例?还是我应该使用其他功能?或者别的什么?
链接示例是基于 class 的 TStopWatch
。
unit StopWatch;
interface
uses
Windows, SysUtils, DateUtils;
type
TStopWatch = class
...
它是在 Delphi 引入基于 TStopWatch
的记录之前发布的。
由于class变体在使用后需要调用Free
,而record based则不需要,所以这里没有混淆。
只需继续使用基于 Delphi 记录的 TStopWatch
,无需在使用后释放它。
通常我使用以下模式:
var
sw : TStopWatch;
begin
sw := TStopWatch.StartNew;
... // Do something
sw.Stop;
// Read the timing
WriteLn(sw.ElapsedMilliseconds);