2012-04-17 1 views
4

私たちはDelphi 7アプリケーションを他のどのマシンよりも20分遅らせることができます。D7によるリモートプロファイリング(メモリプロファイリングではありませんが、タイミング...)

パフォーマンスプロファイル(メモリプロファイルではありません)を取得して、時間の所在を特定したいと考えています。

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

D7 IDE開発環境全体を構築するだけで、AQTimeを使用してこの1つの社内マシンでアプリのプロファイルを作成することができます。

このコードは、私たちが自分で計測するのは複雑すぎます。

高度な(プロシージャまたは行番号)統計情報をリモートで収集するプロファイラに関する提案はありますか?

+0

私たちの状況では、デルファイユニットではなくTCP/IPスタックで遅延が深刻に発生していると確信しているので、サンプリングプロファイラは動作しません。 – RobertFrank

答えて

1

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

+0

所有しているライセンスが許可されている限り。バージョン7以来、かなり制限が厳しくなっています。あなたのdevマシンの外で奇妙な振る舞いをすると、リモートプロファイリングのためのモジュールが歓迎されるでしょう。 彼らは無料版を試すことができます、多分それで十分です。 –

+0

AQTimeの初歩的な使い方以外のすべてのことに慣れていないので、私は開発環境なしで使用できることに気づいていませんでした。 (私たちはフローティングライセンスを持っているので、問題はありません。)開発マシン(.exeに加えて)からテストマシンに移動するにはどのようなファイルが必要ですか?上記のお寄せいただきありがとうございますと追加情報をご提供いただきありがとうございます。 – RobertFrank

+2

@Robert:あなたはexeだけが必要です。それがデバッグ情報でコンパイルされていることを確認してください。 IIRCでは、AQTimeのマニュアルで詳細に説明されています。 – Giel

3

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

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

+0

TD32デバッグ情報もうまくいきます。 – Thomas

+0

@トーマス:あなたは拡大して回答を投稿できますか? – menjaraz

+1

@menjaraz:拡張するものは何もありません。SamplingProfilerはMAPファイルだけでなく、実行可能ファイル内のTD32デバッグセクションも受け入れることを言及しました。あいまいな言葉遣いに残念です。 – Thomas

1

私たちのオープンソース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メソッド(およびその自動残し機能)を使用すると、これに必要なすべての情報が得られます。

ステップごとに手順を実行すると、アプリケーションのボトルネックを非常に迅速に解決できます。また、要求に応じて、エンドカスタマー側でも同じことを実行できます。

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

1

あなたも私のフリー/オープンソースのサンプリングプロファイラ試すことができます。これは、Delphiのデバッグシンボル(.MAP、TD32、.jdbgのすべての種類を使用しています http://code.google.com/p/asmprofiler/wiki/AsmProfilerSamplingMode

(私はSamplingProfilerよりもそれで良い結果を得る) をなど)

関連する問題