私はコンピューターサイエンスの学生であり、プログラムや並べ替えに関しては「オーバーヘッド」という言葉をよく耳にします。これはどういう意味ですか?
操作を設定するために必要なリソースです。無関係に見えるかもしれませんが、必要です。
どこかに行く必要があるとき、車が必要になるかもしれません。しかし、車で通りを運転するのは頭上になりますので、歩きたいかもしれません。ただし、全国を移動する場合、オーバーヘッドはそれだけの価値があります。
コンピュータサイエンスでは、より良い方法がないため、または「歩き方を学ぶ」のに時間を費やす価値がないため、車を使用して道を行くことがあります。
言葉の意味は文脈によって大きく異なります。一般に、使用されるのはリソース(ほとんどの場合メモリとCPU時間)であり、意図した結果に直接寄与しませんが、使用されているテクノロジまたは方法に必要です。例:
あなたは疲れていて、これ以上仕事をすることができません。あなたは食べ物を食べる。食べ物を探し、それを手に入れ、実際にそれを食べるのに費やされるエネルギーはエネルギーを消費し、オーバーヘッドです!
オーバーヘッドは、タスクを達成するために無駄になるものです。目標は、オーバーヘッドを非常に小さくすることです。
コンピューターサイエンスでは、数字を印刷したいと言うことができます。しかし、数値を保存し、それを表示するディスプレイを設定し、それを印刷するルーチンを呼び出し、変数から数値にアクセスすることはすべてオーバーヘッドです。
ウィキペディア カバーされています :
コンピューターサイエンスでは、overheadは一般に、特定の目標を達成するために必要な過剰または間接的な計算時間、メモリ、帯域幅、またはその他のリソースの任意の組み合わせと見なされます。これは、エンジニアリングオーバーヘッドの特殊なケースです。
通常、オーバーヘッドは、さまざまなプログラミングアルゴリズムが使用する余分なリソース(メモリ、プロセッサ、時間など)の量に影響します。
たとえば、バランスの取れたバイナリツリーへの挿入のオーバーヘッドは、単純なリンクリストへの同じ挿入よりもはるかに大きくなる可能性があります(挿入に時間がかかり、より多くの処理能力を使用してツリーのバランスを調整します。これにより、ユーザー)。
プログラマにとってオーバーヘッドとは、与えられた入力データのセットで与えられたプラットフォームで実行されているときにコードによって消費されるシステムリソースを指します。通常、この用語は、異なる実装または可能な実装を比較する文脈で使用されます。
たとえば、特定のアプローチではかなりのCPUオーバーヘッドが発生し、別のアプローチではより多くのメモリオーバーヘッドが発生し、さらに別のアプローチではネットワークオーバーヘッドに重み付けされる場合があります。
具体的な例を挙げましょう:数値セットの平均(算術平均)を計算します。
明らかなアプローチは、入力をループし、現在の合計とカウントを維持することです。最後の数に到達したら(「ファイルの終わり」EOF、または何らかのセンチネル値、または何らかのGUIボタンで通知)、合計を入力数で除算し、完了です。
このアプローチでは、CPU、メモリ、またはその他のリソースに関してオーバーヘッドがほとんど発生しません。 (これは簡単な作業です)。
別の可能なアプローチは、入力をリストに「丸Sみ」することです。リストを反復処理して合計を計算し、リストの有効なアイテムの数で除算します。
比較すると、このアプローチでは、任意の量のメモリオーバーヘッドが発生する可能性があります。
特定の悪い実装では、再帰を使用しているが末尾を削除せずに合計操作を実行する場合があります。現在、リストのメモリオーバーヘッドに加えて、スタックオーバーヘッドも導入しています(これはメモリの種類が異なり、多くの場合、他の形式のメモリよりも限られたリソースです)。
さらに別の(おそらく不合理な)アプローチは、すべての入力をRDBMSのSQLテーブルに投稿することです。次に、そのテーブルのその列でSQL SUM関数を呼び出すだけです。これにより、ローカルメモリのオーバーヘッドが他のサーバーにシフトし、ネットワークオーバーヘッドと実行の外部依存関係が発生します。 (リモートサーバーには、このタスクに関連する特定のメモリオーバーヘッドがある場合とない場合があります。たとえば、すべての値をすぐにストレージに押し出す場合があります)。
仮に、ある種のクラスターでの実装を検討するかもしれません(数兆の値の平均化を可能にするために)。この場合、必要なエンコードと値の配布(ノードへのマッピング)および結果の収集/照合(削減)はオーバーヘッドとしてカウントされます。
プログラマ自身のコード以外の要因によって発生するオーバーヘッドについても説明できます。たとえば、32ビットまたは64ビットプロセッサ用の一部のコードのコンパイルには、古い8ビットまたは16ビットアーキテクチャで見られるよりも大きなオーバーヘッドが伴う場合があります。これには、より大きなメモリオーバーヘッド(アライメントの問題)またはCPUオーバーヘッド(CPUがビットの順序を調整するか、アライメントされていない命令を使用するなど)またはその両方が関係する場合があります。
コードやライブラリなどが占めるディスク容量は、通常「オーバーヘッド」と呼ばれるのではなく、「フットプリント」と呼ばれることに注意してください。また、プログラムが消費するベースメモリ(処理中のデータセットに関係なく)も「フットプリント」と呼ばれます。
オーバーヘッドは、単にプログラムの実行により多くの時間を消費することです。例;関数を呼び出し、そのコントロールが定義された場所に渡され、次にその本体が実行される場合、これはCPUを長いプロセスで実行することを意味します(最初にコントロールをメモリ内の別の場所に渡し、そこで実行してから、コントロールを元の位置に戻す)、その結果、多くのパフォーマンス時間がかかるため、オーバーヘッドがかかります。私たちの目標は、関数の定義と呼び出し時にインラインを使用することでこのオーバーヘッドを削減することです。これにより、関数呼び出しで関数のコンテンツがコピーされます。したがって、コントロールを他の場所に渡さないでください。
辞書を使用できます。定義は同じです。しかし、時間を節約するために、オーバーヘッドは生産的な作業を行うために必要な作業です。たとえば、アルゴリズムは実行され、有用な作業を行いますが、その作業を行うにはメモリが必要です。このメモリの割り当てには時間がかかり、実行される作業に直接関係しないため、オーバーヘッドが発生します。
スレッドの管理とスレッド間の調整に必要な時間としてオーバーヘッドを考えてください。スレッドに実行するための十分なタスクがない場合、負担になります。このような場合、スレッド化を使用することにより、オーバーヘッドコストが節約され、時間はシーケンシャルコードよりも長くなります。
オーバーヘッドの具体例は、「ローカル」プロシージャコールと「リモート」プロシージャコールの違いです。
たとえば、クラシックRPC(およびEJBのような他の多くのリモートフレームワーク)では、関数呼び出しやメソッド呼び出しは、ローカル呼び出し、メモリ呼び出し、分散ネットワーク呼び出しのいずれであっても、コーダーにとっては同じように見えます。
例えば:
service.function(param1, param2);
それは通常の方法ですか、それともリモートの方法ですか?あなたがここで見るものからあなたは言うことができません。
しかし、2つの呼び出しの実行時間の差は劇的であると想像できます。
したがって、コアの実装には「同じコスト」がかかりますが、関連する「オーバーヘッド」はまったく異なります。
Wikipedia を確認できます。ただし、主に、より多くのアクションまたはリソースが使用される場合。 .NETに精通している場合と同様に、値型と参照型を持つことができます。参照型は、値型よりも多くのメモリを必要とするため、メモリオーバーヘッドがあります。