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

Last reviewed 2026-01-28 UTC

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

原則の概要

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

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

推奨事項

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

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

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

簡潔で的を絞ったコードを記述する

必要な結果を得るために不可欠な最小限のコードを記述するには、次のアプローチを使用します。

  • 冗長なロジックと機能の肥大化を排除する: 必要な機能のみを実行するコードを記述します。計算オーバーヘッドと複雑さを増大させるものの、ユーザーに測定可能な価値を提供しない機能は避けてください。
  • リファクタリング: エネルギー効率を長期的に改善するには、アプリケーションを定期的に監査して、使用されていない機能を特定します。必要に応じて、このような機能を削除またはリファクタリングする措置を講じます。
  • 不要なオペレーションを回避する: 結果が必要になるまで、値を計算したりアクションを実行したりしないでください。遅延評価などの手法を使用して、アプリケーションの依存コンポーネントが出力を必要とするまで計算を遅延させます。
  • コードの読みやすさと再利用性を優先する: 読みやすく再利用可能なコードを記述します。このアプローチでは、重複が最小限に抑えられ、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 とメモリの使用率に影響します。効率的なデータ構造を選択するには、次のアプローチを使用します。

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

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

ソフトウェアを開発する際は、テクノロジー スタック全体でリソースを効率的かつ比例的に使用することに重点を置きます。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 バンドルから未使用のコードを削除します。このアプローチにより、ファイルが小さくなり、読み込みが速くなり、サーバー リソースの使用量が少なくなります。
  • ブラウザ キャッシュ: HTTP キャッシュ ヘッダーを使用して、静的アセットをローカルに保存するようユーザーのブラウザに指示します。ブラウザ キャッシュを使用すると、その後のアクセスでダウンロードが繰り返されたり、不要なネットワーク トラフィックが発生したりするのを防ぐことができます。

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

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

  • 効率的なレンダリング: リソースを大量に消費する Document Object Model(DOM)の操作を頻繁に行わないようにします。レンダリングの複雑さを最小限に抑え、不要な再レンダリングを排除するコードを記述します。
  • 軽量設計パターン: 適切な場合は、静的サイトまたはプログレッシブ ウェブアプリ(PWA)を優先します。このようなサイトやアプリは読み込みが速く、必要なサーバー リソースも少なくなります。
  • アクセシビリティとパフォーマンス: 応答性が高く、読み込みの速いサイトは、持続可能性とアクセシビリティが高い傾向があります。最適化されたすっきりとしたデザインにより、コンテンツのレンダリング時に消費されるリソースが削減されます。パフォーマンスと速度が最適化されたウェブサイトは、収益の増加に役立ちます。Deloitte と Google の調査研究「Milliseconds Make Millions」によると、サイトの速度が 0.1 秒(100 ミリ秒)速くなると、小売サイトのコンバージョン率が 8.4% 向上し、平均注文額が 9.2% 増加します。