0

パフォーマンス テストのために、フォームが 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 秒) を費やした構築であることに気付きました。この時間はどこに費やされているのだろうか。参照オブジェクトとして、同様の構造を持つがコードやデータモジュール接続のないモック フォームも作成し、その作成時間を測定します。

4

2 に答える 2

4

「インスタンスの作成」に最適な場所はTObject.NewInstanceです。

Delphi 2009 では、 「逆シリアル化前」に最適な場所はTCustomForm.InitializeNewForm ですそれが利用できない場合は、 TCustomForm.CreateNewをオーバーライドして、返される直前の時刻を取得します。

「逆シリアル化後」に最適な場所はTComponent.Loadedであることは間違いありません。

「before OnFormCreate」については、 TObject.AfterConstructorをオーバーライドし、継承されたメソッドを呼び出す直前の時間を取得します。合計構築時間が必要な場合は、継承された呼び出しが返された後の最終時間を取得します。これには、OnFormCreate と初期アクティベーション時間の両方が含まれます。または、他の場所でオーバーライドしていない場合は、TForm.DoCreateをオーバーライドすることもできます。

于 2010-03-14T15:42:48.733 に答える
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;
于 2010-03-14T14:02:47.540 に答える