Использование `TStopWatch` без` free` - PullRequest
0 голосов
/ 10 мая 2018

Я использую TStopWatch для высокоточного хронометража в Delphi 10.2 Токио.

Этот сайт: 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 не является классом, но все еще требует явной инициализации [с использованием StartNew или Create методов].

Это сбивает с толку.Я использую TStopWatch в функции, и я не использую free.Эта функция может вызываться несколько раз в течение каждого сеанса (возможно, сотни раз, в зависимости от использования).Это означает, что будет создано несколько экземпляров TStopWatch без освобождения.

Существует ли вероятность утечек памяти или других осложнений?Если ответ «да», что я должен делать?Нужно ли создавать только один экземпляр TStopWatch для каждого приложения?Или я должен использовать другие функции?Или что-то еще?

1 Ответ

0 голосов
/ 10 мая 2018

Связанный пример - TStopWatch на основе класса.

unit StopWatch;
interface
uses 
  Windows, SysUtils, DateUtils;

type 
  TStopWatch = class
  ...

Он был опубликован до того, как Delphi представила запись на основе TStopWatch.

Поскольку вариант класса долженпосле использования вызывайте Free, а на основе записей здесь нет путаницы.

Просто продолжайте использовать TStopWatch на основе записей Delphi без необходимости освобождать его после использования.

Обычно я использую следующий шаблон:

var
  sw : TStopWatch;
begin
  sw := TStopWatch.StartNew;
  ... // Do something
  sw.Stop;
  // Read the timing
  WriteLn(sw.ElapsedMilliseconds);  
...