0

对于性能测试,我需要一种方法来测量表单从 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 秒)的构造,这使得我想知道这段时间都花在了哪里。作为参考对象,我还将构建一个具有类似结构但没有代码或数据模块连接的模拟表单,并测量其创建时间。

4

2 回答 2

4

“创建实例”的最佳位置是TObject.NewInstance

在 Delphi 2009 中, “反序列化之前”的最佳位置是TCustomForm.InitializeNewForm。如果这不可用,则覆盖TCustomForm.CreateNew并在它返回之前立即获取时间。

您说得对, “反序列化后”的最佳位置是TComponent.Loaded

For "before OnFormCreate" override TObject.AfterConstructor and get the time immediately before calling the inherited method. If you want the total construction time, grab the final time after that inherited call returns. That will include both the OnFormCreate and any initial activation time. Alternatively, you could just override TForm.DoCreate, if you're not overriding that anywhere else.

于 2010-03-14T15:42:48.733 回答
1

假设表单的 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;
于 2010-03-14T14:02:47.540 回答