Forms Delphi TForm/TPersistent对象如何计算自己的构造和反序列化时间?
对于性能测试,我需要一种方法来测量表单从DFM加载其定义所需的时间。所有现有表单都继承一个自定义表单类 要捕获当前时间,此基类需要重写方法作为“扩展点”:Forms Delphi TForm/TPersistent对象如何计算自己的构造和反序列化时间?,forms,delphi,serialization,tpersistent,Forms,Delphi,Serialization,Tpersistent,对于性能测试,我需要一种方法来测量表单从DFM加载其定义所需的时间。所有现有表单都继承一个自定义表单类 要捕获当前时间,此基类需要重写方法作为“扩展点”: 开始反序列化过程 反序列化后(可以通过重写加载的过程来实现) 执行OnFormCreate事件之前的时刻 因此TMyForm.Create(nil)的日志可能如下所示: - 00.000 instance created - 00.010 before deserialization - 01.823 after deserializatio
过程来实现)
OnFormCreate
事件之前的时刻TMyForm.Create(nil)
的日志可能如下所示:
- 00.000 instance created
- 00.010 before deserialization
- 01.823 after deserialization
- 02.340 before OnFormCreate
哪些ToObject(或TComponent)方法最适合?在表单创建过程中可能还有其他扩展点,请随时提出建议
背景:对于我们的一些应用程序表单,它们有一个非常基本的结构(带有一些页面控件和QuantumGrids),我意识到这不是OnFormShow中的数据库访问和其他内容,而是花费了大部分时间(大约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;
假设加载表单的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;
创建实例的最佳位置是TObject.NewInstance 在Delphi 2009中,反序列化之前进行的最佳位置是TCustomForm.InitializeNewForm。如果不可用,则覆盖TCustomForm.CreateNew并在其返回之前立即获取时间 您是正确的,反序列化后的最佳位置是TComponent.Loaded
对于“before OnFormCreate”重写TObject.AfterConstructor,并获取调用继承方法之前的时间。如果需要总构造时间,请获取继承调用返回后的最后时间。这将包括OnFormCreate和任何初始激活时间。或者,如果您不在其他任何地方覆盖,您可以只覆盖TForm.DoCreate。创建实例的最佳位置是TObject.NewInstance 在Delphi 2009中,反序列化之前进行的最佳位置是TCustomForm.InitializeNewForm。如果不可用,则覆盖TCustomForm.CreateNew并在其返回之前立即获取时间 您是正确的,反序列化后的最佳位置是TComponent.Loaded
对于“before OnFormCreate”重写TObject.AfterConstructor,并获取调用继承方法之前的时间。如果需要总构造时间,请获取继承调用返回后的最后时间。这将包括OnFormCreate和任何初始激活时间。或者,如果您不在其他任何地方覆盖它,您可以只覆盖TForm.DoCreate。我假设QueryProformanceCounter()是QueryPerformanceCounter()的付费订阅版本?@Paul Jan:whoops,现在是非付费订阅版本;)。我假设QueryProformanceCounter()是QueryPerformanceCounter()的付费订阅版本?@Paul Jan:whoops,现在是非付费订阅版本;)。我也遇到了同样的问题,开始使用表单缓存,所以我至少避免了free&recreate。没有回答你的问题,但可能会有帮助…我也有同样的问题,并开始使用表单缓存,所以我至少避免了免费和重新创建。无法回答您的问题,但可能会有帮助。。。