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

Для тестов производительности мне нужен способ измерить время, необходимое для формы, чтобы загрузить ее определение из 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 ответа

Решение

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

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

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

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

Давайте предположим, что загрузка 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;
Другие вопросы по тегам