利益:
- まずプロファイルを取得して実際のボトルネックを測定し、推測ではなくデータに基づいて最適化を行い、プロファイル出力を人工知能によって解釈させることで、
- 起動時間、流暢性、メモリ、バッテリーの観点から最も負荷の高い操作をターゲットにし、メインスレッドから重い作業を削除する機能
- オンデバイス モデルやサンプリングとバッチ処理によるクラウド通話などの AI 機能のバッテリーとプロセッサのコストを管理する機能
モバイル ユーザーはせっかちです。アプリが開くのが遅い、スクロール中にハングする、またはバッテリーがすぐに消耗する場合、ユーザーはそのアプリを削除し、ストアで星評価を付けます。パフォーマンスとバッテリー効率はモバイル アプリの存続に関わる問題です。それはユーザーの満足度とストアのランキングの両方に直接影響します。 AI は、パフォーマンスのボトルネック (ボトルネック) の検出、測定結果の解釈、最適化の推奨を強力に支援します。しかし、最初に測定し、後で最適化するという黄金律は変わりません。この単元では、AI を使用してデータに基づいた方法でパフォーマンスとバッテリーの問題を解決する方法を学びます。特に重要な問題は、前の単元で追加した AI 機能 (オンデバイス モデル、クラウド通話) のバッテリーとパフォーマンスへの影響を管理することです。
測定せずに最適化する
経験の浅い開発者の最大の間違いは、予測最適化です。「これは遅いに違いない」と言って時間を無駄にすることです。本当のボトルネックは、ほとんどの場合、予期しない場所にあります。したがって、最初にプロファイルが取得されます (プロファイリング - アプリケーションのどの部分が時間、メモリ、バッテリーをどれだけ消費するかを測定します)。 Android Studio Profiler と Xcode Instruments はこのジョブに使用されます。測定データを AI に与えることで解釈が高速化されます。しかし、測定を行わずに AI に「アプリケーションが遅いので速度を上げてください」と指示することは、やみくもに予測を行うことを意味します。
パフォーマンスの 4 つの主な軸は次のとおりです。
軸
症状
典型的な原因
開始時間
申し込み開始が遅くなる
メインスレッドでの重い作業
流暢さ(ジャンク)
スクロールが止まる
処理に時間がかかり、UI スレッドで不必要な再描画が発生する
記憶
腫れ、崩れる
リーク、大きな画像、制御されていないキャッシュ
バッテリー/熱
急速な射精
継続的な位置情報、ネットワーク、センサー、バックグラウンドジョブ
ヒント: AI にパフォーマンスの問題について質問する場合は、プロファイル出力 (どの関数にどのくらいの時間がかかるか、メモリ グラフ) を提供します。 「その関数はフレームごとに 30 ミリ秒かかる」などのハードデータにより、AI は実際のボトルネックに焦点を当てることができます。 「遅い」のような主観的な表現は、ありきたりで役に立たない答えを生み出します。
AI 能力のバッテリーコスト
このモジュールで追加した AI 機能は強力ですが、無料ではありません。オンデバイス モデルを抽出すると、プロセッサとバッテリーに負担がかかります。常に実行されている画像認識(各フレームを処理するカメラなど)により、携帯電話が熱くなり、数分以内にバッテリーが消耗します。一方、クラウド AI 通話は、ネットワーク無線 (データを送受信するアンテナ) を常にオンにしておくため、バッテリーを消耗します。解決策: 必要な場合にのみオンデバイス モデルを実行し、フレームごとではなく 1 秒あたり数回カメラをサンプリングし、クラウド リクエストをバッチ送信し、デバイスの充電中またはアイドル中に重労働を実行します。
注意: AI 機能 (ライブ翻訳、継続的オブジェクト認識) を常に実行すると、バッテリーが急速に消耗し、デバイスが熱くなり、システムによって調整される可能性があります。ユーザーにこのコストを感じさせる機能は削除されます。私はいつも AI に「この機能をバッテリーに優しくするにはどうすればよいですか?」と尋ねます。質問もしてください。
最適化の手順
- 測定します。プロファイラーを使用して本当のボトルネックを見つけます。推測しないでください。
- 最大の問題を選択してください。 1% の改善を追い求めないでください。最も高価な取引を目指します。
- AIにデータを聞いてみましょう。プロファイル出力 + 関連コードを使用して最適化の提案をリクエストします。
- 塗布して再度測定してください。改善は本当ですか?数が減りましたか?
- 回帰制御。最適化によって何か問題が発生しましたか?視覚的テストと機能的テストを繰り返します。
ミニケース3個
ケース 1 — 間違った場所で検索する。あるチームはリストが行き詰まっていると考え、数週間かけてスクロール コードを作り直しましたが、無駄でした。プロファイラーを使用してデータを AI に供給したところ、本当のボトルネックは各行ごとにネットワーク上で画像がリロードされることであることが判明しました。ビジュアル キャッシュを追加すると、流暢性が 42 FPS から 60 FPS に増加しました。教訓: 測定により、何週間もの無駄な努力が避けられます。
ケース 2 — バッテリーモンスター機能。翻訳アプリにはカメラによるライブテキスト翻訳が追加されました。ユーザーは「15分で携帯電話が熱くなり、バッテリーが30%なくなった」と苦情を述べた。 AI に問い合わせたところ、カメラは 1 秒あたり 30 フレームを処理していることが判明しました。これを 5 フレームに減らし、数フレーム間隔で結果を更新すると、バッテリー消費量は 3 分の 1 に減少し、品質は気にならなくなりました。教訓: AI は常にバッテリーアイで設定してください。
ケース 3 — 発症が遅い。アプリは 4.5 秒で開きました。ユーザーの 20% が起動時に終了していました。プロファイルは、すべての初期作業 (分析、データの読み込み、モデルの準備) がメインスレッドで順次実行されたことを示しました。 AI の提案により、これらは延期され、後回しにされました。オープニングタイムは1.3秒に短縮され、放棄率は半減した。教訓: 最初は必要不可欠な作業だけを行うようにしましょう。
弱いプロンプト / 強いプロンプト
弱いプロンプト: 「アプリが遅いので、速度を上げてください。」
強力なプロンプト: 「Android アプリケーションでリストのスクロールがスタック (ジャンク) します。プロファイラー データ:bindImageView は各フレームで 28 ミリ秒かかり、画像は毎回ネットワークからロードされ、キャッシュはありません。関連コード: [RecyclerView アダプター コード]。影響の大きい順に 3 つの最も効果的な最適化を推奨します。それぞれについて期待される利益と考えられる副作用を述べます。画質を低下させない解決策を優先します。」
コピー可能なテンプレート
ボトルネック分析テンプレート: 「次のプロファイル データを解釈し、最もコストのかかる 3 つの操作を見つけます: [プロファイラー出力]。それぞれについて考えられる原因と具体的な最適化を提案します。最初に最も大きな影響を与えます。」
バッテリー最適化テンプレート:「この機能はバッテリーをすぐに消耗します: [機能、例: 永続的な場所]。バッテリーに優しいようにします:- サンプリング頻度を減らす - バックグラウンドでの制限 - バッチ処理 - 必要な場合のみ実行する ユーザー エクスペリエンスを中断することなくソリューションを分類する。 [コード]」
起動高速化テンプレート: 「アプリケーションの起動を高速化します。起動時に現在行われていること: [リスト]。どれを延期できるか、バックグラウンドで行うか、遅延ロードできるか? 重要なものを分離します。[コード]」
AI 機能コスト テンプレート: 「追加した [オンデバイス モデル / クラウド通話] 機能のパフォーマンスとバッテリー コストを評価します。測定する必要がある指標とコストを削減する戦略をリストします。[コード]」
よくある間違い
- 測定せずに最適化する。実際のボトルネックは、予測とは異なる場所にあることがよくあります。
- 小さな利益を追いかける。 1% の改善ではなく、最もコストのかかるアクションを目指します。
- AI 機能のバッテリーコストは無視します。モデル/カメラ/ネットワークを常に実行すると、バッテリーが消耗します。
- メインスレッドを疲れさせます。起動とスクロールという重労働を UI スレッドで実行すべきではありません。
- 最適化後の再測定は行いません。改善が本物であり、何も損なわれていないことを確認します。
- エミュレータでのパフォーマンスの測定。実際のデバイスの速度、温度、バッテリーはまったく異なります。
要約すると
パフォーマンスとバッテリーは、モバイル アプリが存続するかどうかの問題です。黄金律: 最初に測定し、後で最適化します。 AIにプロフィールデータを与えることで解釈がスピードアップします。 「スピードを上げたい」という計り知れない欲求は、盲目的な推測につながります。小さな利益を追わず、最も高価な取引を目指します。このモジュールに追加された AI 機能は強力ですが、バッテリーとプロセッサーのコストがかかります。サンプリング頻度を減らし、バッチ処理を行い、必要な場合にのみ実行することで、このコストを管理します。最適化するたびに、実際のデバイスで再度測定します。
アプリケーションタスク
プロファイルをアプリケーション (独自のプロジェクトまたはサンプル) にインポートするか、サンプル プロファイル出力を作成し、「ボトルネック分析テンプレート」を使用して AI に解釈させます。最も影響の大きい最適化を適用して再度測定します。数値は実際に減少しましたか?また、このモジュールで追加した AI 機能 (オンデバイス モデルまたはクラウド通話) を「AI 機能コスト テンプレート」を使用してバッテリーの観点から評価し、バッテリーに優しい設定を少なくとも 1 つ決定します。
チェックリスト
- [ ] 最適化前にプロファイルを取得しましたが、予想外でした
- [ ] 最も高価な取引を目指し、小さな利益をばらまかなかった
- [ ] AIプロファイルデータを具体的な数値で与えてみた
- [ ] AI 機能のバッテリー/プロセッサーのコストを評価しました
- [ ] メインスレッドから面倒な作業を削除しました
- [ ] 最適化後、実機で再度測定し回帰を確認しました