【问题标题】:How can a Delphi TForm / TPersistent object calculate its own construction and deserialization time?Delphi TForm / TPersistent 对象如何计算自己的构造和反序列化时间?
【发布时间】:2010-03-14 12:27:57
【问题描述】:

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

【问题讨论】:

  • 我遇到了同样的问题并开始使用表单缓存,所以我至少避免了免费和重新创建。不回答您的问题,但可能会有所帮助...

标签: forms delphi serialization tpersistent


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    假设表单的 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;
    

    【讨论】:

    • 我假设 QueryProformanceCounter() 是 QueryPerformanceCounter() 的付费订阅版本?
    • @Paul-Jan:哎呀,现在有了非付费订阅版本;)。
    猜你喜欢
    • 1970-01-01
    • 2015-11-08
    • 2023-04-02
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    • 2011-04-06
    相关资源
    最近更新 更多