エネルギー効率に優れたソフトウェアを開発する

Last reviewed 2026-01-28 UTC

Well-Architected Framework のサステナビリティの柱におけるこの原則では、エネルギー消費量とサーバー負荷を最小限に抑えるソフトウェアを作成するための推奨事項が示されています。Google Cloud

原則の概要

ベスト プラクティスに沿ってクラウド アプリケーションを構築すると、クラウド インフラストラクチャ リソース(AI、コンピューティング、ストレージ、ネットワーク)で使用されるエネルギーを最適化できます。また、データセンターの水の使用量と、エンドユーザー デバイスがアプリケーションにアクセスする際のエネルギー消費量を削減できます。

エネルギー効率の高いソフトウェアを構築するには、設計と開発からデプロイ、保守、アーカイブまで、ソフトウェアのライフサイクル全体でサステナビリティを考慮する必要があります。AI を使用してクラウド ワークロードの環境への影響を最小限に抑えるソフトウェアを構築する方法について詳しくは、電子書籍『Build Software Sustainably』をご覧ください。 Google Cloud

推奨事項

このセクションの推奨事項は、次の重点分野にグループ化されています。

計算作業を最小限に抑える

エネルギー効率の高いソフトウェアを作成するには、アプリケーションが実行する計算作業の総量を最小限に抑える必要があります。不要な命令、冗長なループ、追加の機能は、エネルギー、時間、リソースを消費します。次の推奨事項を参考に、計算を最小限に抑えるソフトウェアを構築してください。

無駄のない集約されたコードを作成する

必要な結果を得るために不可欠な最小限のコードを作成するには、次の方法を使用します。

  • 冗長なロジックと機能の肥大化を排除する: 必要な機能のみを実行するコードを作成します。計算のオーバーヘッドと複雑さを増大させるが、ユーザーに測定可能な価値を提供しない機能は避けてください。
  • リファクタリング: エネルギー効率を長期的に改善するには、 アプリケーションを定期的に監査して、使用されていない機能を特定します。必要に応じて、このような機能を削除またはリファクタリングします。
  • 不要なオペレーションを避ける: 結果が必要になるまで、値を計算したり、アクションを実行したりしないでください。遅延評価などの手法を使用して、アプリケーション内の依存コンポーネントが出力を必要とするまで計算を遅らせます。
  • コードの可読性と再利用性を優先する: 可読性と再利用性の高いコードを作成します。このアプローチでは、重複を最小限に抑え、 the Don't Repeat Yourself(DRY)原則に従います。 これにより、ソフトウェアの開発と 保守による二酸化炭素排出量を削減できます。

バックエンド キャッシュを使用する

バックエンド キャッシュを使用すると、アプリケーションが同じ作業を繰り返し実行することを防ぐことができます。キャッシュヒット率が高いほど、リクエストあたりのエネルギー消費量がほぼ直線的に削減されます。バックエンド キャッシュを実装するには、次の手法を使用します。

  • 頻繁に使用されるデータをキャッシュに保存する: アクセス頻度の高いデータを、一時的な 高パフォーマンスのストレージ ロケーションに保存します。Memorystore などのインメモリ キャッシュ サービスを使用します。 アプリケーションがキャッシュからデータを取得すると、データベース クエリとディスク I/O オペレーションの量が削減されます。その結果、バックエンドのデータベースとサーバーの負荷が軽減されます。
  • API レスポンスをキャッシュに保存する: 冗長でコストのかかるネットワーク呼び出しを回避するには、 頻繁な API リクエストの結果をキャッシュに保存します。
  • インメモリ キャッシュを優先する: 低速なディスク I/O オペレーションと複雑なデータベース クエリを排除するには、高速メモリ(RAM)にデータを保存します。
  • 適切なキャッシュ書き込み戦略を選択する:
    • ライトスルー戦略では、データがキャッシュと永続ストレージに同期的に書き込まれます。 この戦略では、キャッシュヒットの可能性が高まるため、永続ストレージに対するエネルギー集約型の読み取りリクエストが少なくなります。
    • ライトバック(ライトビハインド)戦略では、書き込み負荷の高いアプリケーションのパフォーマンスが向上します。データは最初にキャッシュに書き込まれ、データベースは後で非同期的に更新されます。この戦略により、低速なデータベースに対する即時の書き込み負荷が軽減されます。
  • スマートなエビクション ポリシーを使用する: キャッシュを無駄なく効率的に使用します。古いデータやユーティリティの低いデータを削除し、頻繁にリクエストされるデータに使用できるスペースを最大化するには、有効期間(TTL)、Least Recently Used(LRU)、Least Frequently Used(LFU)などのポリシーを使用します。

効率的なアルゴリズムとデータ構造を使用する

選択するアルゴリズムとデータ構造によって、ソフトウェアの生の計算複雑度が決まります。適切なアルゴリズムとデータ構造を選択すると、タスクを完了するために必要な CPU サイクル数とメモリ オペレーションの数を最小限に抑えることができます。CPU サイクルとメモリ オペレーションが少ないほど、エネルギー消費量が少なくなります。

最適な時間複雑度のアルゴリズムを選択する

必要な結果を最短時間で実現するアルゴリズムを優先します。このアプローチは、リソースの使用期間を短縮するのに役立ちます。リソース使用量を最適化するアルゴリズムを選択するには、次の方法を使用します。

  • 複雑さを軽減することに重点を置く: 複雑さを評価するには、 ランタイム指標だけでなく、アルゴリズムの理論的な複雑さも考慮します。 たとえば、 バブルソートと比較して、 マージソートでは、 大規模なデータセットの計算負荷とエネルギー消費量が 大幅に削減されます。
  • 冗長な作業を避ける: 選択したプログラミング言語またはフレームワークで、組み込みの最適化された関数を使用します。これらの関数は、多くの場合、C や C++ などの下位レベルでエネルギー効率の高い言語で実装されているため、カスタムコードの関数よりも基盤となるハードウェアに対して最適化されています。

効率的なデータ構造を選択する

選択するデータ構造によって、データの取得、挿入、処理の速度が決まります。この速度は CPU とメモリ使用量に影響します。効率的なデータ構造を選択するには、次の方法を使用します。

  • 検索と取得を最適化する: アイテムが存在するかどうかの確認や特定の値の取得などの一般的なオペレーションでは、速度が最適化されたデータ 構造を優先します。たとえば、ハッシュマップやハッシュセットを使用すると、ほぼ一定時間で検索できます。これは、配列を線形に検索するよりもエネルギー効率の高いアプローチです。
  • メモリ使用量を最小限に抑える: 効率的なデータ構造は、アプリケーションの全体的なメモリ使用量を削減するのに役立ちます。メモリ アクセスと管理が削減されると、消費電力が削減されます。また、メモリ プロファイルが簡素化されると、プロセスの実行効率が向上し、リソースのアップグレードを延期できます。
  • 特殊な構造を使用する: 特定の問題に合わせて 構築されたデータ構造を使用します。たとえば、文字列プレフィックスの高速検索には トライ データ構造を使用し、最大値または最小値にのみ効率的にアクセスする必要がある場合は優先度キュー を使用します。

コンピューティングとデータ オペレーションを最適化する

ソフトウェアを開発する際は、技術スタック全体でリソースを効率的かつ比例的に使用することに重点を置きます。CPU、メモリ、ディスク、ネットワークは、制限された共有リソースとして扱います。リソースを効率的に使用すると、コストとエネルギー消費量を大幅に削減できます。

CPU 使用率とアイドル時間を最適化する

CPU が有意義な作業を行わずにアクティブでエネルギーを消費する状態になる時間を最小限に抑えるには、次の方法を使用します。

  • ポーリングよりもイベント ドリブン ロジックを優先する: リソースを大量に消費する ビジー ループや定数チェック(ポーリング)をイベント ドリブン ロジックに置き換えます。 イベント ドリブン アーキテクチャでは、アプリケーションのコンポーネントは関連するイベントによってトリガーされた場合にのみ動作します。このアプローチにより、オンデマンド処理が可能になり、リソースを大量に消費するポーリングが不要になります。
  • 一定の高頻度を避ける: CPU が常に最高頻度で動作することを強制しないコードを作成します。エネルギー消費量を最小限に抑えるため、アイドル状態のシステムは低電力状態またはスリープモードに移行できる必要があります。
  • 非同期処理を使用する: アイドル待機中にスレッドがロックされないようにするには、 非同期処理を使用します。このアプローチにより、リソースが解放され、全体的なリソース使用率が向上します。

メモリとディスク I/O を効率的に管理する

メモリとディスクの使用量が非効率的だと、不要な処理が発生し、消費電力が増加します。メモリと I/O を効率的に管理するには、次の手法を使用します。

  • 厳格なメモリ管理: 使用されていない メモリリソースをプロアクティブに解放する措置を実践します。必要以上に長い期間、大きなオブジェクトをメモリに保持しないでください。このアプローチにより、パフォーマンスのボトルネックを防ぎ、メモリ アクセスに使用される電力を削減できます。
  • ディスク I/O を最適化する: 永続ストレージ リソースとの アプリケーションの読み取り / 書き込みインタラクションの頻度を減らします。たとえば、中間メモリ バッファを使用してデータを保存します。固定間隔で、またはバッファが特定のサイズに達したときに、データを永続ストレージに書き込みます。
  • バッチ オペレーション: 頻繁な小規模のディスク オペレーションを、 より少ない大規模なバッチ オペレーションに統合します。バッチ オペレーションは、個々の小規模なトランザクションよりも消費電力が少なくなります。
  • 圧縮を使用する: 適切なデータ圧縮手法を適用して、ディスクへの書き込みまたはディスクからの読み取りを行うデータ量を削減します。たとえば、 Cloud Storage に保存するデータを圧縮するには、 非圧縮トランスコーディングを使用します。

ネットワーク トラフィックを最小限に抑える

ネットワーク リソースは、データ転送オペレーション中に大量のエネルギーを消費します。 ネットワーク通信を最適化するには、次の手法を使用します。

  • ペイロード サイズを最小限に抑える: リクエストに必要なデータのみを 転送するように API とアプリケーションを設計します。少数のフィールドのみが必要な場合に、大きな JSON 構造または XML 構造を取得または返さないでください。返されるデータ構造が簡潔であることを確認します。
  • ラウンドトリップを減らす: ユーザー アクションを完了するために必要なネットワーク ラウンドトリップの数を減らすには、よりスマートなプロトコルを使用します。たとえば、HTTP/1.1 よりも HTTP/3 を優先し、REST よりも GraphQL を選択し、バイナリ プロトコルを使用し、API 呼び出しを統合します。ネットワーク呼び出しの量を減らすと、サーバーとエンドユーザー デバイスの両方のエネルギー消費量を削減できます。

フロントエンドの最適化を実装する

フロントエンドの最適化により、エンドユーザーがダウンロードして処理する必要があるデータが最小限に抑えられ、エンドユーザー デバイスのリソースの負荷を軽減できます。

コードとアセットを最小限に抑える

エンドユーザーがダウンロードして処理する必要があるリソースが小さく、効率的に構造化されている場合、デバイスの消費電力が少なくなります。エンドユーザー デバイスのダウンロード量と処理負荷を最小限に抑えるには、次の手法を使用します。

  • 最小化と圧縮: JavaScript、CSS、HTML ファイルの場合は、 適切な最小化ツールを使用して 空白やコメントなどの不要な文字を削除します。画像などのファイルが圧縮され、最適化されていることを確認します。CI/CD パイプラインを使用して、ウェブアセットの最小化と圧縮を自動化できます。
  • 遅延読み込み: 画像、動画、重要でないアセットは、実際に必要な場合にのみ読み込みます。たとえば、これらの要素がウェブページの ビューポートにスクロールされた場合などです。このアプローチにより、初期データ転送の量とエンドユーザー デバイスの処理負荷が軽減されます。
  • JavaScript バンドルを小さくする: 最新のモジュール バンドラーと、ツリー シェイキングなどの手法を使用して、JavaScript バンドルから未使用のコードを削除します。 ツリー シェイキングなどの手法を使用して、JavaScript バンドルから未使用のコードを削除します。このアプローチにより、読み込みが速く、使用するサーバー リソースが少ない小さなファイルが生成されます。
  • ブラウザ キャッシュ: HTTP キャッシュ ヘッダーを使用して、静的アセットをローカルに保存するようにユーザーの ブラウザに指示します。ブラウザ キャッシュを使用すると、その後のアクセスで繰り返しダウンロードや不要なネットワーク トラフィックが発生するのを防ぐことができます。

軽量なユーザー エクスペリエンス(UX)を優先する

ユーザー インターフェースの設計は、フロントエンド コンテンツのレンダリングの計算複雑度に大きな影響を与える可能性があります。軽量な UX を提供するフロントエンド インターフェースを構築するには、次の手法を使用します。

  • 効率的なレンダリング: リソースを大量に消費する頻繁な ドキュメント オブジェクト モデル(DOM) 操作は避けてください。レンダリングの複雑さを最小限に抑え、不要な再レンダリングを排除するコードを作成します。
  • 軽量なデザイン パターン: 適切な場合は、静的サイト または プログレッシブ ウェブアプリ(PWA)を優先します。 このようなサイトやアプリは読み込みが速く、必要なサーバー リソースが少なくなります。
  • ユーザー補助とパフォーマンス: レスポンシブで読み込みの速いサイトは サステナブルでアクセスしやすいことがよくあります。最適化されたすっきりとしたデザインにすると、コンテンツのレンダリング時に消費されるリソースが削減されます。パフォーマンスと速度が最適化されたウェブサイトは、収益の増加に役立ちます。Deloitte と Google の調査レポート 「Milliseconds Make Millions」 によると、サイトの速度が 0.1 秒(100 ミリ秒)速くなると、小売サイトのコンバージョン率が 8.4% 増加し、平均注文額が 9.2% 増加します。