2

5 秒ごとに実行されるアプリ内の関数をプロファイリングしています。ただし、トレース ビューの [Calls + Rec/Total] オプションには、通話の半分しか表示されません。サンプリング間隔として 1 マイクロ秒のサンプルベースのプロファイリングを使用しています。このサンプリング レートで試してみましたが、目に見える改善は見られませんでした。たとえば、ビューを 236 秒間実行すると、[Call + Rec/Total] オプションで 47 の呼び出しが表示されるはずですが、下の図に示すように 20 しか表示されません。誰かが私が間違っていることについてコメントできますか?

Tested devices: 
Device 1: SmartWatch LG R (Android 6.0.1), observes this problem
Device 2: Samsung Galaxy S2 (Android 5.0.1 Custom ROM), observes this problem
Device 3: Samsung Galaxy S2 (Android 4.4, Custom ROM), works fine 

ここに画像の説明を入力

更新: @kws との話し合いに基づいて、2 番目の Samsung (元々は Android 5.1.1 を使用) に Android 4.4.4 をインストールしましたが、現在はサンプリング ベースの方法で問題なく動作しています。ただし、Android 6.0.1 を搭載したスマートウォッチは、依然としてトレース ビューで古い方法で動作しています。

更新 2: サンプリング ベースの方法では、非常に軽量な関数をキャプチャする解決策がないと思います。これらの関数は 2 つのサンプル間で実行され、このプロファイラーでは見逃される可能性があるためです。サンプリング間隔はマイクロ秒単位でデータを記録していますが、ここまで細かい粒度まで到達できるとは思えません。この引数の背後にある理由は、非常に軽量な関数をテストしたときに、すべての呼び出しが 3 つのデバイスすべてでキャッチされたわけではないということです。

4

1 に答える 1

1

いくつかのテストを行ったところ、ここで同じ動作に気付きました (Kitkat と Marshmallow で実行)。サンプル ベースのプロファイリングを使用し、サンプリング レートを低く設定しすぎると、不正確な結果が得られるようです。サンプリング レートを上げると、より正確な結果が得られる可能性があります。一方、トレース ベースのプロファイリングを使用すると、結果は正確になります。

プロファイラーは実際の結果ではなくサンプル結果を返すことになっているため、これらのサンプルベースのプロファイリング結果は許容できると思います。サンプリング間隔1μsの場合は、デバイスにも依存すると思います。たぶん、ハイエンドのデバイスがより良い結果を生み出す可能性があります.

docsによると、プロファイリングは絶対的なタイミングを生成するために使用するのではなく、コードの最適化の結果を確認するために使用する必要があることにも注意してください。

プロファイリングが有効になっていると、解釈されたコードの実行が遅くなります。プロファイラーの結果から絶対的なタイミングを生成しようとしないでください (「関数 X の実行には 2.5 秒かかります」など)。時間は、他のプロファイル出力との関係でのみ有用であるため、変更によってコードが以前のプロファイリング実行と比較して速くなったか遅くなったかを確認できます。

編集

より正確な結果が必要な場合は、トレース ベースのプロファイリングを使用するか、より正確な Debug クラスを使用する必要があります。後者を使用すると、コード内でトレース データのログ記録を開始および停止する場所を正確に指定できます。詳細はこちら

于 2016-10-29T13:30:00.520 に答える