2

Android Traceviewのトレースベースプロファイリング手法とサンプリングベースプロファイリング手法の違いは何ですか?私はトレースベースの方がより正確だと思っていましたが、実際には機能を持つ他の呼び出しがあると、実際のCPU時間を歪めるようです。Androidトレースベースとサンプリングベースのプロファイルプロファイリングの違いと報告されたCPU時間への影響

たとえば、A-1とA-2の2つの実装を持つ関数Aを評価したいと考えています。

  1. A-1には、A-1-1など、もう1つの関数呼び出しがあります。
  2. A-2にはA-1-1などの関数呼び出しもありますが、A-1-1にはA-1-1-1などの関数呼び出しもあります。

ここで、トレースベースのプロファイリングは、1つの余分な関数A-1-1-1をトレースする必要があり、この余分なCPU使用率がCPU時間でレポートされるため、 A-2の私は正しい?

このように、トレースベースの方法では、親関数の実際のCPU時間を報告するときに子メソッドをトレースすることによってCPUのオーバーヘッド時間が考慮されますか?一方、サンプリングベースの方法の問題は、非常に軽量な機能を捕捉できないことである。関数が0.2ミリ秒のCPU時間を要し、サンプリング間隔が1ミリ秒の場合はどうなりますか?私はそれを使っていくつかの実験を行い、軽量関数呼び出しをキャッチできません。相違点に関するあらゆるアイデアやドキュメントを参照してください。

最終的な質問は、どちらが相対比較のためにより正確ですか?

答えて

1

私が知る限りサンプリング方法はオーバーヘッドを考慮していません。

トレースは、関数呼び出しごとに正しくカウントされます。

サンプリングは、特定の頻度でスタックのスナップショットを取得します。これにより、プログラムで実際に時間が費やされた全体像が得られます。

私の機能は、0.2ミリ秒のCPU時間を要し、かつ サンプリング間隔は1ミリ秒である場合はどう?

  • その機能は、高速動作し、ほとんど、おそらくそれをキャッチしませんサンプリングない呼び出された場合。しかし、めったにファストファンクションと呼ばれることはほとんどありません。

  • 関数が頻繁に呼び出され(例えば50回/時間)、サンプラーによって捕捉されない場合、サンプルが取得された時点で実行されないことを意味します。それは、それが十分に速いことを意味します。

サンプラーが表示するプログラムの大部分をリファクタリングすることで、サンプリングと最適化を行います。 JVM上の微視的な最適化はあなたを遠ざけません。

+0

今のところ、すべての関数呼び出しがどれほど速くても問題ないので、Tracingを先に進めました。同じ関数のさまざまな実装の相対比較のために必要なので、トレースは私のために働いた。 – utengr

+0

それはあなたのために、良い仕事。私はどの言語でも良い経験をしたことはありません。私は大規模システムのそれほど関連性のない部分を最適化することをいつも終わらせました。 –

+0

私は最適化の目的でそれを使用していません。レポートのために、関数呼び出し内のさまざまなアルゴリズムの相対的なCPU時間。例えば、そのアルゴリズムAは2%のCPU使用率を有し、Bは5%のCPU使用率を有する。 – utengr

関連する問題