6

AQTime for Delphi では、領域やトリガーなどを使用して問題のある場所に到達するのが非常に高速であることを誇っています。プロファイリングがオンになっていない場合でも。

たとえば、プログラム フローの後半で特定のルーチンをプロファイリングしたいが、そこで何が呼び出されているかがわからない場合、このルーチンをトリガーとしてのみ配置し、スレッドの初期ステータスをオフにしてから、 「ルーチン/ラインによるフルチェック」を選択します。ただし、これを行うと、トリガールーチンがヒットする前に、プログラムの実行が大幅に遅くなります。

たとえば、「準備フロー」が AQTime なしで約 5 分かかる場合、プロファイリングを無効にして実行すると、すでに 30 分間実行されており、トリガーがまだ到達していないことがわかっている場合でも実行されます。

プロファイリングするルーチン/行の量を減らすことでこれを回避できることはわかっていますが、実際のトリガー ルーチンに到達したらすべてをプロファイリングしたいので、これはあまり良い解決策ではありません。

また、別のより良い回避策として、AQTime を使用せずにアプリケーションを起動し、「準備フロー」が完了した後に [Attach to Process] を使用することもできますが、これは GUI で実行が適切な場所で一時停止するか、適切な時間枠を提供する場合にのみうまく機能します。付けをするためです。すべての場合において、これは当てはまりません。

なぜこれがそうであるかについてのコメントはありますか?また、その領域からコードを削減するか、後でプロセスに追加する以外に何かすることはありますか?

4

5 に答える 5

5

もちろん、私の無料のプロファイラーを試すこともできます:-)
http://code.google.com/p/asmprofiler/

計測とサンプリングの両方のプロファイリングが可能です。AQTime のすべての機能を備えているわけではありませんが、少なくとも無料です (プロファイリングを停止すると、パフォーマンスがわずかに低下します)。

于 2010-04-06T13:30:42.393 に答える
4

AQTime は計測プロファイラーです。実行時には、次のように、プロファイリングするために選択したすべてのメソッド (または、オプションの構成方法に応じて行) を独自のコードで囲みます。

begin
    DoStuff();
end;

...次のようになります:

begin
    AQTimeEnter('MethodName');
    try
        DoStuff();
    finally
        AQTimeLeave('MethodName');
    end;
end;

ソースを変更するのではなく、実行可能ファイルで直接これを行いますが、効果は本質的に同じです。プロファイリングがアクティブな場合、これらの呼び出しは非常に多く発生し、大量の情報をログに記録するため、かなりのオーバーヘッドが発生します。

プロファイリングが非アクティブの場合、何もログに記録されないため、オーバーヘッドが少なくなります。ただし、メソッド呼び出し自体と、try/finally ブロックのオーバーヘッドはまだあります。

プロファイルを減らす以外に、これを改善するために AQTime でできることがあるかどうかはわかりません。ただし、サンプリング プロファイラーを試すこともできます。これは、プロファイラー自体のオーバーヘッドが少なくなりますが、高速に実行されるルーチンの呼び出しを見逃す可能性があります。

于 2010-04-06T13:24:11.537 に答える
2

では、「ルーチン/ラインによる完全なチェック」とはどういう意味ですか。RoutinesとLinesには大きな違いがあります。プロファイリングルーチンによってアプリの速度が大幅に低下することはありません。それは私には向いていません。行によるプロファイリングは非常に遅くなる可能性があります。それが現在行っていることだと思います。

一般に、最初にルーチンごとにプロファイルを作成し、ボトルネックを見つけてから、それらの(そしてそれらだけの)ルーチンを行ごとにプロファイルするという考え方です。

于 2010-04-06T13:37:25.237 に答える
0

使ってみましたか

AQtimeHelpers.EnableProfiling(false); 

準備の開始時とその後

AQtimeHelpers.EnableProfiling(True); 

後?

于 2010-04-06T14:03:59.020 に答える
0

ドリルダウン アプローチを使用する必要があります。最初にプロファイリングが必要な領域をプロシージャごとに特定し、プロファイリングが必要なプロシージャを特定し、それらのみをプロファイリングして、注意が必要なコード行を正確に特定する必要がある場合にのみ行プロファイリングに切り替えます。行ごとにアプリケーションの完全なプロファイリングを有効にすると、AQTime によって実行されるインストルメンテーションが非常に重くなり、データが大量に収集されるため、アプリケーションの速度が大幅に低下します。

于 2010-04-06T20:10:47.543 に答える