オーバーヘッド

オーバーヘッドは、本来の目的以外に必要な余分な処理や手間のことです。

オーバーヘッド のアイキャッチ図解
まずは、こう考えるとつかみやすいです。

オーバーヘッドは、荷物を送るときに必要な梱包・伝票・手続きのようなものです。本来届けたいのは中身だけですが、届けるために避けられないコストがかかります。

ひとことで言うと

オーバーヘッドは、本来やりたいことを実現するために避けられない「余分な手間・処理・コスト」の総称です。

ネットワーク通信では、データ本体のほかに宛先・確認・暗号化などの付帯情報が必要です。 プログラムの実行でも、処理本体のほかに準備・切り替え・後始末が走ります。 これらは直接の目的には含まれないのに、必ず発生するコストです。それがオーバーヘッドです。

たとえ話でもう少し詳しく

オーバーヘッドは、荷物の配送に必要な梱包作業に近いです。

  • 届けたいのは商品本体(データ)だけ
  • でも安全に届けるには、箱・緩衝材・伝票・配送ラベルが必要
  • これらは「届ける」という目的のためには欠かせないが、受け取り側が本当に欲しいものではない

ネットワーク通信でも同じです。 「こんにちは」という3文字を相手に送りたくても、パケットにはIPアドレス・ポート番号・チェックサム・プロトコルのヘッダー情報が付いてきます。 これらはデータを正確に届けるために必要ですが、受け取り手が使いたい情報は「こんにちは」だけです。 この付帯情報や処理の部分がオーバーヘッドです。

よく出る場面・使いどころ

  • 小さなデータを大量に送ると、データ本体より付帯情報の割合が大きくなる
  • TCPの接続確立(3ウェイハンドシェイク)自体が通信のたびに発生するコスト
  • HTTPSでは暗号化・復号処理がオーバーヘッドとしてCPUを使う
  • 関数呼び出しやデータベース接続にも呼び出しのたびに固定コストがかかる

似た言葉との違い

  • レイテンシ
    • リクエストを送ってから最初の返事が届くまでの待ち時間
    • オーバーヘッドはその待ち時間を長くする原因のひとつだが、概念としては別もの
  • 帯域幅
    • 一度に運べるデータ量の上限(回線の太さ)
    • オーバーヘッドが多いと帯域を余分に消費するが、帯域幅そのものとは違う概念
  • パケット
    • データを分割した送受信の単位
    • パケットのヘッダー部分がネットワークのオーバーヘッドに当たる

実務で気にするポイント

  • 小さいリクエストを大量に発行するより、まとめて送る方がオーバーヘッドを減らせる
  • 接続の使い回し(コネクションプール、Keep-Alive)でオーバーヘッドを抑えられる
  • キャッシュを活用して、同じ処理を何度も繰り返さないようにする
  • 最適化の対象としてまずオーバーヘッドを計測し、全体のどこに比率が偏っているか確認する

注意: オーバーヘッドを完全になくすことはできません。「どれだけ削れるか」を考える際は、削ることによる複雑さの増加とトレードオフになることが多いです。過剰な最適化は保守コストを上げるため、計測して本当に問題になっている箇所だけ対処しましょう。