メモリとディスク領域の使用を減らすことでアプリのパフォーマンスを向上させる

このガイドでは、2 つの主な方法で Windows アプリケーションのパフォーマンスを向上させる方法について説明します。

メモリ使用量を最適化する

Windows アプリで使用されるメモリの量を最小限に抑えるには、さまざまな方法があります。次のことができます。

  • フォアグラウンド メモリの使用量を減らします。
  • バックグラウンド作業を最小限に抑えます。
  • バックグラウンドでリソースを解放します。
  • アプリケーションがメモリをリークしないようにします。

メモリ使用量を適切に最小限に抑えるには、まず次の点を理解することが重要です。

分析するシステム トレースを作成したら、メモリ使用量を減らすためにトレース分析を適用するためのガイダンスをお勧めします。

ワーキング セット、動的メモリ、仮想割り当て

アプリケーションのワーキング セット (現在メモリに存在する仮想アドレス空間内のページのセット) は、アプリのメモリ使用量の 1 つの尺度です。

アプリケーションが使用するメモリの量は、実行時のパフォーマンスと、システム全体の応答性に影響します。 メモリの使用を最小限に抑えることで、より多くのメモリへのアクセスに関連する CPU コストを削減することで、アプリのパフォーマンスを向上できます。 また、メモリ使用量を減らしても、アプリケーションが他のメモリ コンテンツを置き換えないため、システムの応答性とアプリ ユーザーのエクスペリエンス全般に役立ちます。

メモリの移動は、最近アクセスされたメモリ内コンテンツをシステムが保持しようとしたときに発生する可能性があり、必要に応じて、以前に使用したコンテンツをトリミングしてページアウトします。 ユーザーがシェルまたは別のアプリケーションに戻り、必要なデータがメモリ内に存在しない場合は、データをディスクから読み取る必要があります。 このプロセスにより、ユーザーは速度低下に気付く可能性があります。

アプリケーションで使用されるメモリには、1) 動的メモリと 2) ファイルベースのメモリの 2 つの重要な部分があります。 ファイルベースのメモリ使用量は、アプリケーションによって使用されるバイナリとデータ ファイル (データベースなど) から取得されます。 これは通常、アプリケーションのメモリ使用量の重要なチャンクではなく、多くの場合は定数です。 (例外は、データ処理アプリケーション、コードコンパイルなどです) メモリ使用量のより重要なソースであり、リーク マニフェストは動的メモリです。

動的メモリは、メモリ割り当てルーチンを使用して アプリケーションによって割り当てられた仮想メモリに対応します。 システムの再起動後も保持されるファイルベースのメモリとは異なり、動的メモリはアプリケーションの有効期間中のみ存在します。 動的メモリは、メモリ使用量の一般的に重要なソースであり、メモリ リークマニフェストが発生します。

仮想割り当てルーチン (VirtualAlloc) は、メモリ割り当てに使用されるアプリケーション層ルーチンとは無関係に、Windows アプリケーションからのメモリ割り当て要求を処理します。 アプリケーションによって割り当てられたすべてのメモリが常にメモリに常駐しているわけではありませんが、このような割り当てを分析すると、アプリケーションのメモリ使用量を一貫して理解できます。

アプリケーションのメモリ使用量を理解し、改善する場所を見つけるには、以下の説明に従って VirtualAllocation トレースをキャプチャすることをお勧めします。

システム トレースをキャプチャしてメモリ使用量を分析する

一定期間のデバイス アクティビティの記録は、システム トレースと呼ばれます。システム トレースは、レポートの生成に使用できるトレース ファイルを生成し、アプリのパフォーマンスを向上させる方法を特定するのに役立ちます。

トレースの長さはさまざまです。

  • 実行時間の短いトレースを使用して、アプリケーションの起動をキャプチャできます。 これには、非アクティブ状態へのアプリの移行が含まれる場合があります。アプリケーション ウィンドウは最小化されるか、アプリケーション プロセスが保持されている間はアプリケーション ウィンドウが閉じられます。
  • 実行時間の長いトレース (通常、実行時間は数分) は、メモリ リークの診断に役立ちます。 メモリ使用量が時間の経過と同時に増加し続ける場合、通常はリークが示唆されます。

メモリ使用量の監視には、次のような複数のツールを使用できます。

この記事では、Windows パフォーマンス アナライザーの使用に焦点を当てます。 アプリケーションのパフォーマンスをプロファイリングするためのツールの選択の詳細については、「Visual Studio パフォーマンス プロファイラー、Windows パフォーマンス ツールキット、PerfView の選択」を参照してください。

トレース キャプチャを実行します

  1. 管理者モードコマンド ライン (PowerShell またはコマンド プロンプト) を開きます。 (管理者モードで実行しない場合は、"ポリシーを有効にしてシステムのパフォーマンスをプロファイルできませんでした" 0xc5585011というエラー コードが表示されることがあります)。

  2. コマンド wpr -start VirtualAllocation -filemode を入力します。

  3. 調査しているシナリオを実行します。 (アプリケーションの起動など)。

  4. コマンド wpr -stop Trace.etl を入力します。

システム トレースを分析する

削減できる可能性のあるメモリが割り当てられているアプリの関数を見つけるには、キャプチャされたシステム トレースを分析する必要があります。 トレースを分析する

  1. 次のコマンドwpa.exe Trace.etlを入力して、Windows パフォーマンス アナライザーを使用してトレースを開きます。

  2. グラフ エクスプローラー ウィンドウで、[メモリ] セクションを展開し、[合計コミット] グラフを右クリックして、[新しい分析ビューにグラフを追加] を選択します。

  3. ビュー エディターを開くには、設定の歯車をクリックし、[プロセス]、[コミットの種類]、[コミット スタック]、[サイズ] の列の配置を選択します。

  4. 結果が降順で並べ替えられるように、[サイズ ] 列ヘッダーをクリックします。 コミット スタック はメモリが割り当てられるまでのコード パスを示す。 これらの結果は、割り当ての理由を理解するのに役立つ場合があります。 サイズで並べ替えることで、より大きな割り当てに集中し、最適化の機会があるかどうかを調査できます。

  5. プロセスを右クリックし、[フィルターから選択] を選択 して、分析対象のプロセスにフィルターを適用します。

  6. ビューポートで目的の領域にズーム インするには、範囲を選択し、グラフを右クリックして、[ズーム]を選択します。

  7. コミット スタック内を移動して、メモリが割り当てられている関数を理解します。 コミット スタックにはシンボルが読み込まれている必要があります。 シンボルを読み込むには、上部のナビゲーション メニュー バーから [シンボルの読み込みトレース>] を選択します。

    Windows Performance Analyzer memory trace screenshot

トレース分析を適用してメモリ使用量を削減する

割り当てられたメモリを分析する際に、メモリ使用量を最小限に抑えることができる場所を決定するのに役立つ手掛かりが見つかります。

メモリ使用量を減らすためにコードの更新にトレース分析を適用する場合に考慮すべきいくつかの領域を次に示します。

  • フォアグラウンドでのメモリ使用量の削減: メモリ トレースを分析すると、フォアグラウンドで不要なメモリ使用量を特定し、その使用量を減らすか削除するようにコードを更新するのに役立つ場合があります。

  • バックグラウンドでの作業の最小化: システムには、プロセスワーキング セットからページを除外するポリシーがあります。 バックグラウンドで使用するメモリが少ないほど、アプリケーションのメモリの常駐を減らすことで、システムの効率を向上できます。 バックグラウンド作業を最小限に抑えて電力消費量とバッテリ寿命を向上させる方法について説明します。バックグラウンドでのメモリ使用量も少なくなります。

  • バックグラウンドでリソースを解放する: 実行時に、アプリケーションによってメモリ キャッシュが作成されるだけでなく、UI をサポートするためのグラフィックス割り当てが作成される場合があります。 これらの割り当ては、アプリケーションが最小化されている場合や表示されない場合に解放できる場合があります。 アプリケーションは、このようなアクションを実行するためにメモリ不足の通知を登録できますが、アプリケーションが非アクティブであると判断した場合は、使用されていない期間が経過した後にメモリを解放することをお勧めします。 この使用期間はアプリケーションによって異なる可能性があるため、非アクティブな使用の可能性のあるインジケーターは、数分から 1/2 時間以上の範囲です。 この種のメモリ節約と応答性のバランスを取るために注意する必要があります。 キャッシュの再構築コストが高い場合、アプリケーションは、アプリケーションの有効期間中にキャッシュを保持することを選択できます。

  • アプリケーションがメモリをリークしないようにします。メモリ リークをチェックするには、まず、アプリケーションのメモリ使用量が一定の値を超えて増加しない安定した状態のベンチマークを確立します。 アプリケーションを継続的に使用するか、バックグラウンドでアイドル状態のままにすることで、この安定状態を確立できます。 キャプチャしたトレースを使用してメモリ リークの可能性を特定すると、そのメモリがコードに割り当てられている場所と、その目的を果たした後に使用を解放する方法を確認できます。 アプリケーションの実行中にメモリが増加し続ける場合は、メモリ リークを示している可能性があります。 トレース内の増加に対応するリージョンを拡大し、コミット スタックを慎重に分析します。

ディスク領域を効率的に使用する

ディスク フットプリント とは、アプリケーションが非アクティブな状態 (コードを実行していない) に格納されている場合のアプリケーションのサイズを指します。 アプリケーションが大量のディスク占有領域を占める場合は、最適化の機会になる可能性があります。

アプリのディスク占有領域を減らすと、パフォーマンスが向上する方法はいくつかあります。

  • ディスクがいっぱいになると、ファイル システムは新しいコンテンツを連続して格納できなくなります。 ディスク全体が断片化され、連続していないセクターに新しいコンテンツが格納されます。 これにより、ディスクからそのコンテンツにアクセスするときの待機時間が長くなります。 IO システムは、コンテンツが連続していて、順次アクセスできる場合や、より大きな IO を使用できる場合に、ディスク スループットが大幅に向上します。

  • ディスク全体が SSD ベースのシステムの書き込み待機時間が長くなる可能性があります。 書き込みを吸収する空のセルが少なくなると、書き込みによって読み取り/変更/書き込み操作が発生し、パフォーマンスが低下する可能性があります。

  • ディスクがいっぱいの場合、アプリケーションを更新できない可能性があります。 OS は回復力があり、システムを最新の状態に保ち、セキュリティで保護することができますが、使用可能なディスク領域が少なくても、アプリの更新プログラムのコンテンツをステージングするために使用可能なディスク領域が正常に確保されると、より高速でスムーズな更新エクスペリエンスに変換されます。

  • 実行時に大量のディスク 占有領域にアクセスする必要がある場合は、メモリの使用にも変換されます。 これは、アプリケーションとシステムの一般的な応答性に影響します。 さらに、実行時にディスクフットプリントのごく一部が必要な場合、アプリケーションはディスク領域を非効率的に使用している可能性があります。

ディスク領域を減らす、または効率を上げるには、次のような方法があります。

  • ディスクのフットプリントに "従量課金制" の原則を適用する (必要なものだけをダウンロードする) : アプリケーションには、すべてのユーザーに適用される機能の一部ではなく、幅広い機能が含まれる場合があります。 これは、ディスク占有領域が大きい理由の 1 つです。 "従量課金制" の原則を適用することで、必要な機能のみをダウンロードするようにユーザーに依頼し、アプリのダウンロード時にディスク占有領域を小さくすることができます。 追加コンテンツは、ユーザーがより豊富な機能を必要とする場合にのみ、ダウンロード時に省略可能になります。 機能に加えて、言語サポートにも同じ "従量課金制" 原則を適用できます。 アプリケーションには、既定で一般的な言語の選択肢のサブセットを含めることができます。追加の言語は、必要に応じてユーザーのシステムに設定された場所に含まれるか、または依存します。

  • 効率的なキャッシュ サイズ設定を適用する: 場合によっては、アプリケーションでディスク上のキャッシュを使用して、ユーザー エクスペリエンスの応答性を高めることができます。 ポリシーは、アプリケーションがキャッシュを管理する方法を設定できます。ディスクの容量に基づいてキャッシュ サイズに上限を設定し、ディスク上の空き領域が少ない場合はキャッシュのサイズを変更します。

  • 資産の効率的な使用を適用する: 多くの場合、アプリケーションには画像資産が含まれます。また、複数の解像度をサポートするために、さまざまなイメージ サイズで構成される場合があります。 解像度のサブセットに合わせて画像のサイズ、サイズ、形式、圧縮を最適化し、再メイン解像度をサポートするためにスケーリングを利用することで、ディスク占有領域を大幅に削減できます。

  • バイナリ最適化の機会を調査する: SizeBenchなどのツールを使用すると、アプリケーションの作成者は、バイナリ フットプリントの影響を調査し、使用されるディスク領域を減らす機会を見つけることができます。

その他のリソース