Jetpack Microbenchmark ライブラリを使用すると、Android Studio 内から Android ネイティブ コード(Kotlin または Java)のベンチマークを実行できます。ライブラリはウォームアップを処理し、コードのパフォーマンスと割り当てを測定して、ベンチマーク結果を Android Studio コンソールと JSON ファイルの両方に詳細情報とともに出力します。
ベンチマークを作成する前に、コードをプロファイリングすることをおすすめします。これにより、最適化が必要な、費用の高いオペレーションを見つけることができます。また、実行中に動作の内容を表示して、処理が遅くなる理由を明らかにすることもできます。たとえば、優先度の低いスレッドでの実行、ディスクへのアクセスによるスリープ、ビットマップのデコードなどコストの高い関数の予期せぬ呼び出しなどがあります。
マイクロベンチマークは、アプリ内で何度も実行される CPU 処理(ホットなコードパスとも呼ばれます)の測定に大変役立ちます。たとえば、一度に 1 つの項目を表示する RecyclerView
スクロール、データの変換 / 処理、繰り返し使用されるコードなどがその良い例です。
その他のタイプのコードを Microbenchmark ライブラリで測定するのは困難です。ベンチマークはループ実行されるため、頻繁に実行されないコードや、呼び出されるたびに実行方法が変化するコードの場合、ベンチマークに適していません。
継続的インテグレーション(CI)環境でこのライブラリを使用する方法については、継続的インテグレーションでベンチマークを実行するをご覧ください。
キャッシュの測定を回避する
キャッシュのみを測定しないように注意してください。たとえば、カスタムビューのレイアウトのベンチマークを行うと、レイアウト キャッシュのパフォーマンスのみが測定される可能性があります。これを回避するには、ループごとに異なるレイアウト パラメータを渡します。ただし、ファイル システムのパフォーマンスを測定するケースなどでは、ループ中に OS がファイル システムのキャッシュを保存するため、この回避策も難しい場合があります。
一貫性のあるベンチマークを取得する
モバイル デバイスのクロックは、High 状態(高パフォーマンス時)から Low 状態(節電時やデバイス高温時)へと動的に変化します。このようなクロックの変化によって、ベンチマークの数値が大きく変化することがあります。そのため、ライブラリにはこの問題に対処する方法が用意されています。
クロックをロックする(ユーザーに root 権限のあるデバイスが必要)
安定したパフォーマンスを得るには、クロックをロックすることをおすすめします。これにより、デバイスが熱くなるほどクロックの High 状態が続いたり、ベンチマークが CPU をフルに活用していないときにクロックが Low 状態になったりすることがなくなります。Gradle タスク(gradlew lockClocks
)で適用することも、CI で手動で適用することもできます。この方法は、安定したパフォーマンスを確保するうえでは最善の方法ですが、root 権限を持つ Android デバイスが必要になるため、ほとんどのデバイスでサポートされていません。
パフォーマンス維持モード
Window.setSustainedPerformanceMode()
は、最大 CPU 周波数を抑えるようにアプリレベルで選択できるデバイスでサポートされています。Microbenchmark ライブラリは、この機能がサポートされているデバイス上で実行されると、この API と独自のアクティビティ起動を組み合わせて使用することで、サーマル スロットリングを防ぐとともにベンチマーク結果を安定させます。
この機能は、Android Gradle プラグインが設定する testInstrumentationRunner
によって、デフォルトで有効になります。カスタム ランナーを使用する場合は、AndroidBenchmarkRunner
をサブクラス化して、testInstrumentationRunner
として使用できます。
ランナーは、非透過的なフルスクリーン アクティビティを起動して、ベンチマークがフォアグラウンドで実行される状態にし、他のアプリは描画しません。
自動実行の一時停止
クロックロックとパフォーマンス維持モードのいずれも使用しない場合、ライブラリは、自動サーマル スロットリング検出を行います。有効にすると、内部ベンチマークが定期的に実行され、CPU のパフォーマンスを低下させるほどデバイスの温度が高くなっていないか判定します。CPU パフォーマンスの低下が検出されると、ライブラリは実行を一時停止し、デバイスが冷却した後で、現在のベンチマークを再試行します。
AOT コンパイル
複雑なマイクロベンチマークは安定し、
検出が非常に困難です。測定の一貫性とスピード
反復速度が最優先事項であるため、androidx.benchmark
プラグインは完全に
以下と同様に、デフォルトで microbenchmark APK をコンパイルします。
Macrobenchmark の CompilationMode.Full
。この動作にはベンチマークが必要です
1.3.0-beta01+
、Android Gradle プラグイン 8.4.0+
。この通知を受け取らないように
androidx.benchmark.forceaotcompilation=false
を
gradle.properties
ファイル。
サンプル
GitHub リポジトリにある次のサンプルをご覧ください。
参考情報
フィードバックを送信
ベンチマークの使用に関して問題の報告や機能リクエストの送信を行う場合は、公開されている Issue Tracker をご利用ください。
あなたへのおすすめ
- 注: JavaScript がオフになっている場合はリンクテキストが表示されます
- アプリのベンチマークを行う
- ベースライン プロファイルを作成する {:#creating-profile-rules}
- JankStats ライブラリ