Delphi TForm / TPersistent对象如何计算自己的构造和反序列化时间?

时间:2010-03-14 12:27:58

标签: forms delphi serialization tpersistent

对于性能测试,我需要一种方法来测量表单从DFM加载其定义所需的时间。所有现有表单都继承自定义表单类。

要捕获当前时间,此基类需要覆盖方法作为“扩展点”:

  1. 开始反序列化过程
  2. 反序列化后的
  3. (可以通过覆盖Loaded程序实现)
  4. 执行OnFormCreate事件
  5. 之前的那一刻

    因此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 个答案:

答案 0 :(得分:4)

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

在Delphi 2009中,反序列化之前的最佳位置 TCustomForm.InitializeNewForm 。如果不可用则覆盖 TCustomForm.CreateNew 并在它返回之前抓住时间。

你认为反序列化后“的最佳位置” TComponent.Loaded

对于“之前OnFormCreate”覆盖 TObject.AfterConstructor 并在调用继承方法之前立即获取时间。如果您想要总施工时间,请在继承的调用返回后抓取最后时间。这将包括OnFormCreate和任何初始激活时间。或者,您可以覆盖 TForm.DoCreate ,如果您没有覆盖其他任何地方。

答案 1 :(得分: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;