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