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