首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi TForm / TPersistent对象如何计算自己的构造和反序列化时间?

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

Stack Overflow用户
提问于 2010-03-14 12:27:57
回答 2查看 826关注 0票数 0

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

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

反序列化

  1. start process
  2. after反序列化(可以通过重写Loaded过程来实现)
  3. 就在执行OnFormCreate事件

之前

因此,TMyForm.Create(nil)的日志可能如下所示:

代码语言:javascript
复制
- 00.000 instance created
- 00.010 before deserialization
- 01.823 after deserialization
- 02.340 before OnFormCreate

哪种TObject (或TComponent)方法最适合?也许在表单创建过程中还有其他扩展点,请随时提出建议。

背景:对于一些具有非常基本结构的应用程序表单(包括一些PageControls和QuantumGrids),我意识到不是数据库访问和OnFormShow中的其他东西,而是大部分时间(大约2秒)花费的构造,这让我想知道这段时间是在哪里度过的。作为一个引用对象,我还将构建一个模拟表单,它具有类似的结构,但没有代码或数据模式连接,并测量它的创建时间。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-14 15:42:48

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

在Delphi2009中,TCustomForm.InitializeNewForm.是“反序列化前”的最佳位置。如果这是不可用的,请覆盖TCustomForm.CreateNew,并在它返回之前抓住时间。

您正确地认为,TComponent.Loaded.是“反序列化后”的最佳位置

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

票数 4
EN

Stack Overflow用户

发布于 2010-03-14 14:02:47

假设表单的DFM加载是表单构造的主要时间部分,我们可以向表单中添加一个构造函数,如下所示:

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2442127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档