4

社内に1台のマシンがあり、Delphi7アプリの起動は他のどのマシンよりも20倍遅くなっています。

パフォーマンスプロファイル(メモリプロファイルではない)を取得して、時間を費やしている場所を特定したいと思います。

私たちが所有しているAQTimeは、リモートプロファイリングを行わないことを発見しました。

AQTimeを使用して、この1台の社内マシンでアプリのプロファイルを作成できるようにするために、時間をかけてD7IDE開発環境全体を構築することは避けたいと思います。

コードは少し複雑すぎて、自分で測定することはできません。

高レベル(手順または行番号)の統計をリモートで収集するプロファイラーに関する提案はありますか?

4

4 に答える 4

3

SamplingProfilerを見てください。「リモート」プロファイリングは行いませんが、開発環境も必要ありません。プロファイルするプログラムを起動できる必要があり(したがって、同じマシンで実行する必要があります)、プログラムには、リンカーによって生成された.MAPファイルが.EXEと同じフォルダーにある必要があります。これが社内にある場合、それはあなたにとって問題ではないはずです。

また、ヘルプファイルを見ると、AQTimeでは実行できないプログラムの特定のセクションのみをプロファイルする方法も見つかります。これは、問題がスタートアップコードなど、特定の場所にあることがわかっている場合に役立ちます。

于 2012-04-17T23:53:07.810 に答える
1

無料/オープン ソースのサンプリング プロファイラーを試すこともできます: http://code.google.com/p/asmprofiler/wiki/AsmProfilerSamplingMode

(SamplingProfiler よりも良い結果が得られます) あらゆる種類の Delphi デバッグ シンボル (.map、TD32、.jdbg など) を使用します。

于 2012-04-18T05:59:47.060 に答える
1

オープン ソースTSynLogクラスを使用して、開発者のコ​​ンピューターだけでなく、任意のアプリケーションにプロファイリングを追加できます。

他のツールのように自動化されたプロファイラーではありません。コードを変更する必要があります。ただし、要求に応じてリモートで実行することも、エンド カスタマー側からの通信がまったくなくても実行することもできます。

プロファイリング呼び出しをいくつかのメソッド コードに追加すると、メソッドの出入りがテキスト ファイルに記録されます。その後、提供されたログ ビューアーが利用可能になり、プロファイリングを実行し、遅いメソッドを特定するための専用のメソッドが用意されています。

ログからのメソッドのプロファイリング
(ソース: synopse.info )

ロギング メカニズムを使用して、再帰呼び出しを追跡できます。インターフェイスベースのメカニズムを使用して、メソッドに出入りするときにログを記録できます。

procedure TMyDB.SQLExecute(const SQL: RawUTF8);
var ILog: ISynLog;
begin
  ILog := TSynLogDB.Enter(self,'SQLExecute');
  // do some stuff
  ILog.Log(sllInfo,'SQL=%',[SQL]);
end; // when you leave the method, it will write the corresponding event to the log

次のようにログに記録されます。

20110325 19325801  +    MyDBUnit.TMyDB(004E11F4).SQLExecute
20110325 19325801 info   SQL=SELECT * FROM Table;
20110325 19325801  -    MyDBUnit.TMyDB(004E11F4).SQLExecute 00.000.507

ここでは、メソッド名がコード ( 'SQLExecute') に設定されています。しかし、関連付けられた.mapファイルがある場合、ロギング メカニズムはこのシンボル情報を読み取り、イベントの正確な行番号を書き込むことができます。ファイルの高度に圧縮されたバージョン.map(900 KB .map-> 70 KB .mab、つまり zip や lzma よりもはるかに優れている) を使用したり、ビルド時にそのコンテンツを実行可能ファイルに埋め込むこともできます。

したがって、メソッド レベルでプロファイリングを追加するには、メソッドの先頭に 1 行のコードを追加するだけです。

procedure TMyDB.SQLExecute(const SQL: RawUTF8);
begin
  TSynLogDB.Enter;

  // do some stuff

end; // when you leave the method, it will write the corresponding event to the log

高解像度のタイムスタンプもファイルに記録されます (ここでは00.000.507)。これにより、実際のコンピューターで、顧客側からのデータを使用してアプリケーションをプロファイリングできます。メソッド (およびその自動退出機能) を介して、Enterこれに必要なすべての情報を入手できます。

段階を追って進めることで、アプリケーションのボトルネックにすぐにたどり着くことができます。また、要求に応じて、エンド カスタマー側でも同じことを行うことができます。

私はこれをいくつかのアプリケーションで使用しましたが、特定のハードウェア、ソフトウェア、およびネットワーク構成 (顧客が何を使用しているかはわかりません) であっても、いくつかのボトルネックを非常に簡単に見つけました。

于 2012-04-18T05:47:50.513 に答える
1

マシンに AQTime をインストールして、スタンドアロンのプロファイラーとして使用してみませんか? 「D7 IDE 開発環境全体」は必要ありません。

于 2012-04-18T09:45:08.463 に答える