
-
アプリの電力消費のプロファイリングと最適化
アプリの最適化によってバッテリー駆動時間を最大限に延ばす方法を学びましょう。Xcodeに接続しているか、それ以外の環境で再現できるかどうかにかかわらず、アプリの電力消費に関する問題の根本原因を特定する方法を紹介します。電力消費量を測定する方法を知ることで、新機能の導入について適切な判断を下し、より効率的なアプリの構築に向けてプロアクティブな施策を実行できます。
関連する章
- 0:00 - ようこそ
- 1:52 - 再現可能な問題のデバッグ
- 9:37 - 検出しにくい問題の特定
- 16:19 - 電力消費量の比較
- 18:25 - プロアクティブな最適化
リソース
関連ビデオ
WWDC25
-
このビデオを検索
こんにちは Wiamです Appleのソフトウェアエンジニアです 消費電力の最適化についてお話しします
優れた高品質なアプリ体験を提供するのは 皆さんの得意分野です 一日中頼りにできるアプリが求められており その信頼性に欠かせないのが 優れたバッテリー駆動時間です アプリの消費電力の効率が高ければ 継続利用率と満足度が向上します まさにウィンウィンです でも バッテリーの消費が激しいアプリだと ポジティブな体験はすぐに 失われてしまいます でも 秘密兵器があったらどうでしょうか 強力で 信じられないくらいに エネルギー効率の良いアプリを 開発できるツールです このビデオでは このツールの機能を 活用して 消費電力の問題を解決する 新しい方法を学びます 詳しく見ていく前に 今日の取り組みの 大まかな内容をお話しします まず 机上で簡単に再現できる問題に 取り組むことから始めます 実用的な例を取り上げて 過剰な電力の使用を特定し 減らす方法を紹介します
次に もっと手ごわい 特定しにくい現実のシナリオに どう対処するかを探ります どんな環境でも データを キャプチャする方法を紹介します
次に さまざまな実装の消費電力を比較する 方法を紹介します これにより わかりやすい方法で アプリの効率を測定して改善できます
最後に 開発プロセスの初期段階で 消費電力の問題を事前に検出し 高度に最適化されたバージョンのアプリを 配信する方法を取り上げます
Xcodeで 消費電力が大きい箇所を見つけて 問題に気づくこともあるでしょう ですが 根本原因の究明は難しいものです そんな時には アプリを実行して問題を再現し 消費電力に関する指標を記録する 機能が必要になります
InstrumentsのPower Profilerは そんな状況にぴったりのツールです アプリのプロファイルを取得して 消費電力のトレースを記録し Instrumentsで視覚化できます 今 このアプリで ちょうどその問題を 解決しようとしています ビデオストリーミングアプリの Destination Videoです iPhoneやiPadでのコンテンツ 視聴用に設計されています アプリ強化のため ペインを追加し コレクション 全体をブラウズしやすくしました その後 Xcode Organizerの エネルギーレポートを確認したところ 以前よりもCPU使用率が 大幅に増加していました これは パフォーマンスと バッテリー駆動時間の低下に直結します InstrumentsでPower Profilerを使用して この問題を調べることにします まず XCodeプロジェクトを開き iPhoneをワイヤレスで接続します 製品に移動しをクリックします アプリがビルドされ デバイスに インストールされて Instrumentsが開きます 空白のテンプレートを選択し と を選択して CPU使用率に関する情報もキャプチャします 必要に応じて他の機器を選択できます デフォルトの設定を使用して 記録を開始します
次に デバイスに切り替えて ペインを開きます
ペインを開くときに ハングも起きているようです 今調べている問題と関係ありそうです ここで記録を停止しトレースを調べます 「command + control + Z」を押して 記録に注目します トラックの左にある三角印をクリックして Power Profilerトラックを拡大します Power Profilerにより システムレベルの 消費電力指標と アプリ単位の消費電力の 影響の指標を表示できます 最初のレーンは システムの電力使用量の レーンで 電力消費に関する 全体的な数値を表示します 値が大きいほど アプリはより多くの 電力を消費していると考えられます ある領域を選択して ペインで平均値を調べられます このトレースである時間領域を選択すると ペインには 毎時10.5%と表示されます 次のステップは アプリの消費電力による 影響の指標を確認することです 様々なサブシステムについて 確認できる指標がいくつかあります CPU、GPU、ディスプレイ、 ネットワーク消費電力による影響などです CPU消費電力による影響のレーンは重要です 高負荷のCPUアクティビティは 電力消費の大きな要因になります CPUを持続的に または高負荷で使用すると 電力使用量が直接的に増加します ペインを開いた直後に CPU消費電力による影響で スパイクが発生しています 前の領域を強調表示し CPU消費電力による 影響の平均値を測定します 平均値は1です 次に スパイクを強調表示します CPU消費電力による影響の平均は21です 以前よりも大幅に高くなっています この値から予期しない電力消費のスパイクが いつ起きるかを識別し 影響の大きいサブシステムの デバッグを優先できます
は 最もCPU時間を 消費している関数を特定して CPUオーバーヘッドの原因を突き止めます をクリックし アプリ固有のコードに絞って分析します ビューを調べて を選択します ペインでは VideoCardViewに大幅な時間が 費やされていることがわかります このビューのbodyは比較的単純なので 問題はおそらく呼び出しの 頻度にありそうです 次に LibraryThumbnailViewを確認します ペインのすべての ビデオサムネイルを作成しているので そこに問題がありそうです Xcodeに戻り このビュー内のコードを分析します
このコードはビデオの 配列全体を反復処理します ビデオごとにVideoCardViewが生成され そこからサムネイルと それを表示するビューが作成されます これらのビューはすべて VStack内に配置されます 何百 何千本ものビデオがあると 想像してみてください このアプローチではすべてのサムネイルを ロードし ビューをすべて 作成してから ペインが 表示されます 実際に画面に 表示されるかは関係ありません これは非効率的です Instrumentsで見た 高いCPU使用率の理由がわかりました アプリは まだ必要ないコンテンツまで 読み込んで 作業過多になっています 幸い SwiftUIにはこれに対処できる 優れたAPIがあります LazyVStackです 現在表示中のアイテム またはこれから スクロール表示する先のビューのみを 作成してレンダリングします 最適化するのは簡単です VStackの使用を LazyVStackに置き換えます 同じビデオの配列ですが ビュー自体がスクロールに合わせて アイテムビューの作成と廃棄を スマートに処理します この最適化をテストしてみます もう一度をクリックして 記録を開始します 次に デバイスで ペインを開きます
アプリが応答しています ハングしなくなりました 記録を停止し CPU消費電力による影響の レーンまでスクロールします
同じ領域を強調表示して平均値を測定します 今回は平均値が下がり 以前の21から4.3になりました これでCPUの問題は解決です ペインで ビデオサムネイル全部を事前に 読み込んでいたのが 不必要な電力消費の原因でした Instrumentsで 非効率的なコードを特定できました オンデマンド読み込みに切り替えると 機能のパフォーマンスが大幅に向上します CPUプロファイリングと最適化の 手法をさらに深く理解するには WWDCのビデオ 「Optimize CPU performance with Instruments」の視聴をお勧めします Power Profilerはアプリの電力消費について 貴重なインサイトを提供します 問題がありそうなときや どのサブシステムを見ればよいのか 何を最適化したらよいのか わからないときにぜひご活用ください ここまで iPhoneをXcodeに接続して プロファイリングしてきました これは制御試験にはよいのですが いつも全体像が見えるとは限りません 実稼働環境でしか現れない 想定通りに行かない問題はどうでしょうか 机上で一貫して再現することが 難しい問題です それはこんなシナリオかもしれません CarPlayでのナビゲーション中に アプリは実際にどう動作するのか 拡張現実機能は屋外で 実際にどのくらいの電力を消費するのか 表示までに何時間もかかるバックグラウンド バッテリーの使用状況をどうデバッグするか 品質チームがフィールドテストから 実用的な消費電力診断を簡単に行うには どうすればよいか これらを解決するには Xcodeに 直接接続せずに 実際の使用状況から データを収集する方法が必要になります Power Profilerは デバイス上でも利用できます これを使えば 開発中に 再現できない問題を見つけることができます 具体的な例を見てみましょう 最近 同僚がバッテリー駆動時間に関する 重大な問題を報告しました 私のアプリの Destination Videoは 彼のデバイスで いつも一番バッテリーを消費するそうです 色々試しましたが 私の設定では再現できませんでした 皆アプリの使い方が違うので 彼の場合は私がまだ遭遇していない エッジケースだったのかもしれません デバイス上の消費電力プロファイリングの おかげで 実機は必要ありませんでした ただ この新しいモードを使用して トレースを収集してもらい ファイルを送ってもらいました このデータの収集はとても簡単です まず設定アプリでデベロッパモードを オンにします これはデバイスを Xcodeに接続した後に利用可能になります 次に デベロッパ設定の に移動します パフォーマンストレースを有効にすると Power Profilerのオプションが表示されます 必ずオンにしてください 次に プロファイルを取得するアプリを 指定する必要があります XcodeやTestFlight または Enterprise Program経由で インストールされたアプリのみ監視可能です リストからアプリを選択します いいですね では データ収集を開始します デバイスの右上隅から下にスワイプして コントロールセンターにアクセスします パフォーマンストレースアイコンを使って データ収集を開始します 追加したら アイコンをタップして 記録を開始します 数時間実行し続けることも 問題が再現されるまで 実行することもできます では 収集を停止します コントロールセンターのパフォーマンス トレースアイコンを再度タップするだけです これで 収集された消費電力に関する指標 すべてを含む トレースファイルが生成され Macと共有してInstrumentsで直接開けます できました これが同僚がした操作でした では 送られてきたファイルを分析して 根本原因を特定する方法を紹介します Instrumentsでファイルを開きます デバイス上の消費電力トレースを使用して システムレベルの消費電力指標と アプリごとの消費電力による影響の指標 Time Profilerにアクセスできます このモードのTime Profilerはオブザーバ 効果低減のため 低いサンプルレートです CPU消費電力による影響のレーンを見ると CPUへの影響には明確なパターンがあります CPUへの大きな影響が目立つ領域があり その後に続く CPUへの影響が少ない期間を 周期的に繰り返しています Destination Videoアプリに 期待する動作ではありません 影響が大きい領域のうちの 1つを詳しく調べると この電力使用量の原因を突き止められます Time Profilerを確認して この期間中に実行されている 関数を把握します videoSuggestionsForLocationが 一番上で CPU時間を大幅に消費しています これは位置情報に基づいてビデオを 推奨するための関数の一部です 近くのランドマークや イベントに関するビデオを提案します 位置情報が変更されるたびに呼び出されます 道理で ここでは再現できないわけですね デスクに座っているだけでは 場所はあまり変わりません アプリ起動時に関数が一度実行されても その後は同じ場所のままです でも 同僚は通勤中にアプリを使用しています ずっと動いています 位置情報が頻繁に更新されたために 重いフィルタリング処理が 何度も行われていました Destination Videoアプリに移動します
この機能は ペインに表示されます 位置情報ベースのおすすめが ポップアップする場所です すべて同じ関数が関係しています 問題を起こしている関数がわかりました コードを詳しく調べて どうすれば 最適化できるかを考えましょう videoSuggestionsForLocationは 場所が変わるたびに呼び出されます 表示される関連動画リストの 生成に関わっています 現時点では 呼び出されるたびに このRecommendationRulesファイルを Dataオブジェクトに読み込み JSONDecoderを使用し 解析して RecommendationRuleマップに変換します このJSONファイルは小さくありません 何百もの複雑なルールが含まれています ファイルI/OとJSON解析は 特に大きなファイルの場合 リソースを大量に消費します アプリは これらすべての高負荷の作業を 場所が変わるたびに何度も繰り返します 問題の原因とみて間違いありません ルール自体がアプリの実行中に 変更されることはありません 最適化では基本的に ルールの 読み込みと解析の回数を減らし 1回だけにし キャッシュします このシンプルな変更で 毎回位置情報を 更新するときの作業が軽くなります 私のアプリの場合 さらに最適化した後 同じ同僚にもう一度テストしてもらいました 皆さんのアプリでこのような 修正をするときはいつでも 同条件でテストし 新しい消費電力トレースを 取得してくれる人を探してください 元の問題が実際に修正されたことを 確認するのにぴったりの方法です 同じくらい大切なこととして 変更時に誤って新しい電力消費の問題が 入り込んでいないかも確認できます 問題を完全に解決して 最適化に自信を持てます
既存の問題を追跡する 方法について説明しました でも 配信する前に どうすれば自信を持って 様々な最適化戦略の中から 選択できるでしょうか 最適化にトレードオフが必要かもしれません CPU使用率は低くなっても ネットワーク アクティビティが増えるかもしれません バッテリー駆動時間への 実質的な影響はどうすればわかりますか よくあるシナリオはこんな感じです あなたは新しい機能を開発中です 実装が終わりました これをアプローチ1と呼びます シンプルな構造で 小さいサイズのデータで テストすると効率も高いように見えます でも 同僚がアプローチ2を提案します 異なるアーキテクチャで 少し複雑です 小さいデータセットを処理するスピードは 少し遅いかもしれません でも 大量のデータをはるかに 適切に処理する設計になっています あなたはジレンマを抱えます どちらが バッテリー駆動時間にとって よいのでしょうか これをローカルテストや コード検証だけで決めるのは かなり難しいでしょう ローカルテストは 一般的なデータサイズと ネットワーク条件やバックグラウンド アクティビティのパフォーマンスへの影響を 表さない場合があります ここでPower Profilerを活用できます 特に影響を比較できます 1つ目のアプローチでアプリを プロファイリングし 2つ目のアプローチで 再度プロファイリングして その値を比較できます 覚えておいてほしいのは 熱、 デバイスの状態、システム圧力などの条件が 最終的な電力使用量に影響する 可能性があるということです これにはアプリの状態も含まれます 管理しているデータの量 有効になっている環境設定や機能などです これらの変数に対応するには 例えば 各アプローチを様々な条件下で 複数回実行してキャプチャし 結果を平均化します そのデータを使用して 機能や実装に関する意思決定を 行うことができます 最終的にアプリを最適化し 最高のエクスペリエンスを実現できます Power Profilerはたくさんある 強力なツールのうちの1つです コーディング中にXcodeのEnergy Gaugesで すぐにフィードバックを取得して Instrumentsで詳しく確認できます 自動化されたXCTestで 問題を早期に発見しましょう 配信後 現場での影響を監視するには Xcode Organizer、MetricKit App Store Connect APIを使用します これらはエネルギー効率を 向上させるためのサポートツールで 貴重なコンテキストと インサイトを提供します 有効に活用することで 開発プロセスに強力なエネルギー効率戦略を 組み込めます これで 皆さんは消費電力効率の高いアプリを ビルドするツールと知識を手に入れました Power Profilerを早い段階から頻繁に使用し データに基づいて意思決定を行い 学んだことを基に反復してください ここで1つチャレンジです 今すぐ自分のアプリをトレースして 結果データを確認してみてください 新しいスキルを実践してみる 楽しい方法です 消費電力についての私からの ヒントは以上です ありがとうございました
-