「オーバーヘッド」とは何ですか?


149

私はコンピュータサイエンスの学生です。プログラムや並べ替えに関しては、「オーバーヘッド」という言葉をよく耳にします。これは正確にはどういう意味ですか?


27
何かを手に入れるためにあなたがどれだけの「余分なもの」をする必要があるか。たとえば、「He​​llo World」を印刷するためだけに37クラスのプロジェクトをロードする必要がある場合、オーバーヘッドが多いと考えます。
scunliffe

1
@ doug65536実際、それは逆です。=)
福沢幸夫2013年

回答:


177

オペレーションをセットアップするために必要なリソースです。それは無関係に見えるかもしれませんが、必要です。

どこかに行く必要があるとき、車が必要になるかもしれません。しかし、車で通りを走るのはかなりのオーバーヘッドになるので、歩いてみたいかもしれません。ただし、国中を移動する場合、オーバーヘッドは価値があります。

コンピュータサイエンスでは、より良い方法がないために車を使って通りを下る場合があります。または、「歩く方法を学ぶ」ことは時間の価値がありません。


84
同様の例えが飛んでいるでしょう。飛行機は車よりもはるかに高速ですが、空港のチェックインやセキュリティなどのオーバーヘッドにより、車は距離が短い場合に適しています。
FogleBird 2010年

s / drive / go /(どこかを運転する必要がある場合、通常は歩くことに決めません...
RCIX

1
@ inf3rno皮肉?どうやって車に行くの?私たちは歩く。そして、私たちは完全に私たちの車まで歩くことができます... たとえ車よりも近くにあるとしても、目的地まで歩くことはできません。
corsiKa 2014

オーバーヘッドの少ないJavaコードを書くとしたら、「操作のセットアップに必要なリソース」の定義に関して、それをどのように解釈しますか。私のコードは多くの設定を必要としませんか?
committedandroider

まあ、あなたはコンピュータまたはサーバーをオンにする必要があり、オペレーティングシステムとすべてのドライバーをロードする必要があります、Javaプロセスを起動する必要があります、JVMをオンにする必要があります、すべてのクラスをロードする必要があります、あなたは「hello world」を実行できるように、IOバッファーをコンソールに同期する必要があります。ただし、オーバーヘッドの少ないコーディングについて詳しく教えてください。
corsiKa 2015年

40

単語の意味は、コンテキストによって大きく異なる場合があります。一般に、使用されるのはリソース(ほとんどの場合はメモリとCPU時間)であり、意図した結果には直接寄与しませんが、使用されているテクノロジまたは方法で必要とされます。例:

  • プロトコルのオーバーヘッド:イーサネットフレーム、IPパケット、TCPセグメントにはすべてヘッダーがあり、TCP接続にはハンドシェイクパケットが必要です。したがって、ハードウェアが実際のデータに使用できる帯域幅全体を使用することはできません。大きなパケットサイズを使用するとオーバーヘッドを削減でき、UDPのヘッダーは小さく、ハンドシェイクはありません。
  • データ構造のメモリオーバーヘッド:リンクリストには、含まれる要素ごとに少なくとも1つのポインタが必要です。要素がポインタと同じサイズの場合、これは50%のメモリオーバーヘッドを意味しますが、配列は0%のオーバーヘッドを持つ可能性があります。
  • メソッド呼び出しのオーバーヘッド:適切に設計されたプログラムは、多数の短いメソッドに分割されます。ただし、各メソッド呼び出しには、スタックフレームのセットアップ、パラメーターと戻りアドレスのコピーが必要です。これは、単一のモノリシック関数ですべてを実行するプログラムと比較した場合のCPUオーバーヘッドを表します。もちろん、追加された保守性は非常に価値がありますが、場合によっては、過度のメソッド呼び出しがパフォーマンスに大きな影響を与える可能性があります。

単語のように
聞こえ

データ構造メモリのオーバーヘッドについて:ほとんどのメモリアロケータでは、それよりもさらに悪いです。によって返される各値にmallocは、ブロックのサイズとガード値で構成されるアロケーター(クラシック32ビットマシンを想定)のため、8バイトの組み込みオーバーヘッドがあります。そしてそれは、割り当ての細分性について考える前でもあります。したがって、単純な4バイト整数の単一リンクリストには、75%のオーバーヘッドがあります。配列はオーバーヘッドが1回(または配列が動的に割り当てられていない場合はそれ以下)になる可能性があるため、(途中で高速に挿入する必要がある場合を除いて)はるかに優れています。
ドナルフェロー

19

あなたは疲れていて、これ以上の仕事はできません。あなたは食べ物を食べます。食べ物を探し、それを食べ、実際に食べるエネルギーはエネルギーを消費し、頭上にあります!

オーバーヘッドは、タスクを実行するために浪費されるものです。目標は、オーバーヘッドを非常に小さくすることです。

コンピュータサイエンスでは、数値を印刷したいとしましょう。それがあなたの仕事です。しかし、数値を保存し、それを印刷するためにディスプレイを設定し、それを印刷するためにルーチンを呼び出し、変数から数値にアクセスすることはすべてオーバーヘッドです。


17

ウィキペディアは私たちをカバーしています:

コンピュータサイエンスでは、オーバーヘッドは通常、特定の目標を達成するために必要な、過剰または間接的な計算時間、メモリ、帯域幅、またはその他のリソースの任意の組み合わせと見なされます。これはエンジニアリングオーバーヘッドの特殊なケースです。


4
しかし、そうでない場合は、WikiPediaを修正してから、同じ投稿をここに作成します。
SamGoody、2011年

11

オーバーヘッドは通常、さまざまなプログラミングアルゴリズムが使用する追加のリソース(メモリ、プロセッサ、時間など)の量に依存します。

たとえば、バランスの取れたバイナリツリーに挿入するオーバーヘッドは、単純なリンクリストへの同じ挿入よりもはるかに大きくなる可能性があります(挿入に時間がかかり、ツリーのバランスを取るためにより多くの処理能力を使用します。ユーザー)。


5

プログラマにとって、オーバーヘッドとは、特定の入力データセットの特定のプラットフォームで実行されているときに、コードによって消費されるシステムリソースを指します。通常、この用語は、異なる実装または可能な実装を比較する文脈で使用されます。

たとえば、特定のアプローチではかなりのCPUオーバーヘッドが発生する可能性があり、別のアプローチではより多くのメモリオーバーヘッドが発生し、さらに別のアプローチではネットワークオーバーヘッドに加重される可能性がある(たとえば、外部依存関係を伴う)と言えます。

具体的な例を挙げましょう:一連の数値の平均(算術平均)を計算します。

明白なアプローチは、実行合計とカウントを維持しながら入力をループすることです。最後の数値が検出されると(「ファイルの終わり」のEOF、または何らかのセンチネル値、またはGUIボタンなどによって通知されます)、合計を入力数で除算するだけで完了です。

このアプローチでは、CPU、メモリ、またはその他のリソースに関するオーバーヘッドはほとんど発生しません。(それは簡単な仕事です)。

別の可能なアプローチは、入力をリストに「丸める」ことです。リストを反復処理して合計を計算し、それをリストからの有効な項目の数で割ります。

比較すると、このアプローチでは任意の量のメモリオーバーヘッドが発生する可能性があります。

特定の不適切な実装では、再帰を使用して合計操作を実行する場合がありますが、末尾削除はありません。ここで、リストのメモリオーバーヘッドに加えて、スタックオーバーヘッドも導入します(これは、メモリの種類が異なり、多くの場合、他の形式のメモリよりもリソースが制限されます)。

さらに別の(おそらくもっとばかげた)アプローチは、RDBMSのSQLテーブルにすべての入力をポストすることです。次に、そのテーブルのその列でSQL SUM関数を呼​​び出すだけです。これにより、ローカルメモリのオーバーヘッドが他のサーバーにシフトし、ネットワークオーバーヘッドと外部依存関係が発生します。(リモートサーバーには、このタスクに関連する特定のメモリオーバーヘッドがある場合とない場合があることに注意してください。たとえば、すべての値がストレージにすぐに排出される場合があります)。

仮説として、ある種のクラスターに対する実装を検討する場合があります(おそらく数兆個の値の平均化を実現可能にするため)。この場合、必要な値のエンコードと値の分散(それらをノードにマッピング)、および結果の収集/照合(縮小)はオーバーヘッドとしてカウントされます。

プログラマー自身のコード以外の要因によって発生するオーバーヘッドについても説明できます。たとえば、32ビットまたは64ビットプロセッサのコードをコンパイルすると、古い8ビットまたは16ビットアーキテクチャの場合よりもオーバーヘッドが大きくなる可能性があります。これには、より大きなメモリオーバーヘッド(アライメントの問題)またはCPUオーバーヘッド(CPUがビットの順序を調整するように強制される、またはアライメントされていない命令を使用するなど)またはその両方が含まれる場合があります。

コードやライブラリなどが占めるディスク容量は、通常「オーバーヘッド」と呼ばれるのではなく、「フットプリント」と呼ばれます。また、プログラムが消費するベースメモリは(処理するデータセットに関係なく)、「フットプリント」とも呼ばれます。


3

オーバーヘッドとは、単にプログラムの実行にかかる時間のことです。例; 関数を呼び出し、そのコントロールが定義された場所に渡され、その本体が実行されると、CPUが長いプロセスを実行するようになります(最初にコントロールをメモリ内の他の場所に渡してから、そこで実行します。コントロールを元の位置に戻す)、その結果、多くのパフォーマンス時間がかかるため、オーバーヘッドが発生します。私たちの目標は、関数の定義と呼び出し時にインラインを使用することでこのオーバーヘッドを削減することです。これにより、関数呼び出しで関数のコンテンツがコピーされるため、コントロールを他の場所に渡さず、プログラムを1行に続けるため、インラインで。


2

辞書を使用できます。定義は同じです。しかし、時間を節約するために、オーバーヘッドは生産的な作業を行うために必要な作業です。たとえば、アルゴリズムは実行されて有用な作業を行いますが、その作業を行うにはメモリが必要です。このメモリ割り当てには時間がかかり、実行中の作業とは直接関係がないため、オーバーヘッドになります。


1

ウィキペディアをチェックできます。しかし、主に、より多くのアクションまたはリソースが使用される場合。.NETに慣れている場合と同様に、値タイプと参照タイプを使用できます。参照型は値型より多くのメモリを必要とするため、メモリのオーバーヘッドがあります。


1

オーバーヘッドの具体例は、「ローカル」プロシージャコールと「リモート」プロシージャコールの違いです。

たとえば、従来のRPC(およびEJBのような他の多くのリモートフレームワーク)では、関数またはメソッドの呼び出しは、ローカルのメモリ内呼び出しでも、分散ネットワーク呼び出しでも、コーダーにとって同じように見えます。

例えば:

service.function(param1, param2);

それは通常の方法ですか、それともリモートの方法ですか?ここで目にするものからはわかりません。

しかし、2つの呼び出しの実行時間の違いが劇的であると想像できます。

そのため、コア実装は「同じコスト」になりますが、関連する「オーバーヘッド」はかなり異なります。


1

オーバーヘッドは、スレッドの管理とスレッド間の調整に必要な時間と考えてください。スレッドに実行する十分なタスクがない場合は、負担になります。このような場合、オーバーヘッドのコストはスレッディングを使用することで節約された時間になり、コードは逐次的なものよりも時間がかかります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.