Как объект Delphi TForm / TPersistent может рассчитать свое время создания и десериализации? - PullRequest
0 голосов
/ 14 марта 2010

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

Для захвата текущего времени этому базовому классу нужны переопределенные методы как «точки расширения»:

  1. начало процесса десериализации
  2. после десериализации (может быть реализовано путем переопределения процедуры Loaded)
  3. момент непосредственно перед выполнением OnFormCreate события

Таким образом, журнал для TMyForm.Create(nil) может выглядеть так:

- 00.000 instance created
- 00.010 before deserialization
- 01.823 after deserialization
- 02.340 before OnFormCreate

Какие методы TObject (или TComponent) лучше всего подходят? Возможно, есть другие точки расширения в процессе создания формы, пожалуйста, не стесняйтесь вносить предложения.

Справочная информация : для некоторых форм наших приложений, которые имеют очень базовую структуру (с некоторыми PageControls и QuantumGrids), я понял, что это не доступ к базе данных и другие вещи в OnFormShow, а конструкция, которая потребовала большую часть время (около 2 секунд), которое заставляет меня задуматься, где это время тратится. В качестве эталонного объекта я также создам фиктивную форму, которая имеет аналогичную структуру, но не имеет соединений с кодом или модулем данных, и измерю время ее создания.

Ответы [ 2 ]

4 голосов
/ 14 марта 2010

Лучшее место для "созданного экземпляра" - TObject.NewInstance .

В Delphi 2009 лучшее место для "до десериализации" - TCustomForm.InitializeNewForm . Если это недоступно, переопределите TCustomForm.CreateNew и получите время непосредственно перед его возвратом.

Вы правы, что лучшее место для "после десериализации" - это TComponent.Loaded .

Для "before OnFormCreate" переопределить TObject.AfterConstructor и получить время непосредственно перед вызовом унаследованного метода. Если вы хотите общее время создания, захватите последний раз после того, как унаследованный вызов вернется. Это будет включать в себя как OnFormCreate и любое начальное время активации. В качестве альтернативы, вы можете просто переопределить TForm.DoCreate , если вы не переопределите это где-либо еще.

1 голос
/ 14 марта 2010

Давайте предположим, что загрузка DFM формы является основной частью времени построения формы, мы могли бы добавить конструктор к форме, например:

constructor TMyForm.Create( AOwner: TComponent );
var
    S, E: Int64;
begin
  QueryPerformanceCounter( S );
  inherited Create( AOwner ); // here is the dfm loading
  QueryPerformanceCounter( E );
  // Log using the classname and the time in QPC ticks.
  LogQPCTime( ClassName, E - S );
end;
...