オープン ソース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
これに必要なすべての情報を入手できます。
段階を追って進めることで、アプリケーションのボトルネックにすぐにたどり着くことができます。また、要求に応じて、エンド カスタマー側でも同じことを行うことができます。
私はこれをいくつかのアプリケーションで使用しましたが、特定のハードウェア、ソフトウェア、およびネットワーク構成 (顧客が何を使用しているかはわかりません) であっても、いくつかのボトルネックを非常に簡単に見つけました。