私たちのオープンソースTSynLog
classを使用して、開発者用コンピュータだけでなく、あらゆるアプリケーションにプロファイリングを追加することができます。
他のツールとして、自動プロファイラではありません。コードを変更する必要があります。しかし、エンド・カスタマー側からでも遠隔から、そしてまったく通信しなくても要求に応じて実行できます。
いくつかのメソッドコードにいくつかのプロファイリング呼び出しを追加し、メソッドの入力と終了をテキストファイルに記録します。その後、supplied log viewerが利用可能であり、プロファイリングを行う専用の方法がいくつかあり、遅い方法を特定しています。
Profiling methods from log http://blog.synopse.info/public/LogView01.png
ロギングメカニズムは、再帰呼び出しをトレースするために使用することができます。あなたが入力した任意の方法を離れるときには、ログインするためのインタフェースベースのメカニズムを使用することができます。
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
メソッド(およびその自動残し機能)を使用すると、これに必要なすべての情報が得られます。
ステップごとに手順を実行すると、アプリケーションのボトルネックを非常に迅速に解決できます。また、要求に応じて、エンドカスタマー側でも同じことを実行できます。
私はいくつかのアプリケーションでこれを使用し、特定のハードウェア、ソフトウェア、ネットワーク構成(お客様が何を使用しているか分かりません)でも非常に簡単にいくつかのボトルネックを発見しました。
私たちの状況では、デルファイユニットではなくTCP/IPスタックで遅延が深刻に発生していると確信しているので、サンプリングプロファイラは動作しません。 – RobertFrank