对于性能测试,我需要一种方法来测量表单从DFM加载其定义所需的时间。所有现有表单都继承自定义表单类。
要捕获当前时间,此基类需要覆盖方法作为“扩展点”:
Loaded
程序实现)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秒)让我想知道这个时间花在哪里。作为参考对象,我还将构建一个模拟表单,它具有类似的结构,但没有代码或数据模块连接,并测量其创建时间。
答案 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;