2010-05-18 8 views
97

Ich bin Student in Informatik und höre das Wort "Overhead" viel, wenn es um Programme und Sortierungen geht. Was bedeutet das genau?Was ist "Overhead"?

+20

Wie viel "extra Zeug" müssen Sie tun, um etwas zu bekommen. z.B. Wenn ich ein 37-Klassen-Projekt aufladen muss, nur um "Hallo Welt" zu drucken, würde ich das viel Overhead berücksichtigen. – scunliffe

+0

Danke allen – yuudachi

+8

Antwort

122

Es sind die Ressourcen, die zum Einrichten einer Operation erforderlich sind. Es scheint nicht verwandt, aber notwendig.

Es ist wie wenn du irgendwohin musst, brauchst du vielleicht ein Auto. Aber es wäre eine Menge Aufwand, um ein Auto zu bekommen, um die Straße hinunter zu fahren, so dass Sie vielleicht gehen möchten. Allerdings wäre der Aufwand es wert, wenn Sie durch das Land gehen würden.

In der Informatik benutzen wir manchmal Autos, um die Straße hinunter zu gehen, weil wir keinen besseren Weg haben, oder es ist unsere Zeit nicht wert, "laufen zu lernen".

+57

Eine ähnliche Analogie wäre Fliegen. Flugzeuge sind viel schneller als Autos, aber der Overhead des Flughafens Check-in, Sicherheit, etc. macht Autos eine bessere Option für kürzere Strecken. – FogleBird

+0

s/drive/go/(Wenn du irgendwohin * fahren musst, entscheidest du normalerweise nicht zu laufen ... – RCIX

+11

'es ist nicht unsere Zeit wert" zu lernen wie man läuft ".' - epic: D – inf3rno

9

Overhead bezieht sich normalerweise auf die Menge an zusätzlichen Ressourcen (Speicher, Prozessor, Zeit usw.), die verschiedene Programmieralgorithmen benötigen. Der Overhead der Einfügung in einen ausgeglichenen Binärbaum könnte viel größer sein als derselbe Insert in eine einfache Linked List (der Einsatz dauert länger, benötigt mehr Rechenleistung, um den Tree auszubalancieren, was zu einem längeren Ergebnis führt) wahrgenommene Betriebszeit durch den Benutzer).

1

Sie könnten ein Wörterbuch verwenden. Die Definition ist dieselbe. Um jedoch Zeit zu sparen, ist Overhead die Arbeit, die für die produktive Arbeit erforderlich ist. Zum Beispiel läuft ein Algorithmus und macht nützliche Arbeit, benötigt aber Speicher, um seine Arbeit zu erledigen. Diese Speicherzuordnung benötigt Zeit und steht nicht in direktem Zusammenhang mit der ausgeführten Arbeit, ist also ein Overhead.

15

Wikipedia has us covered:

In der Informatik Kopf ist im Allgemeinen eine beliebige Kombination von überschüssigem oder indirekte Berechnung Zeit, Speicher, Bandbreite oder andere Ressourcen berücksichtigt, die erforderlich sind ein erreichen bestimmtes Ziel. Es ist ein spezieller Fall von Engineering-Overhead.

+2

Aber wenn nicht, würdest du WikiPedia reparieren und dann den gleichen Beitrag hier machen. – SamGoody

0

Sie können Wikipedia überprüfen. Aber hauptsächlich wenn mehr Aktionen oder Ressourcen verwendet werden. Wenn Sie mit .NET vertraut sind, können Sie Werttypen und Referenztypen verwenden. Referenztypen haben einen Speicheraufwand, da sie mehr Speicher als Werttypen benötigen.

4

Für einen Programmierer Overhead bezieht sich auf die Systemressourcen, die von Ihrem Code verbraucht werden, wenn es auf einer geben-Plattform auf einem bestimmten Satz von Eingabedaten ausgeführt wird. Üblicherweise wird der Begriff im Zusammenhang mit dem Vergleich verschiedener Implementierungen oder möglicher Implementierungen verwendet. Beispielsweise könnte man sagen, dass ein bestimmter Ansatz einen beträchtlichen CPU-Overhead verursachen kann, während ein anderer mehr Speicher-Overhead verursachen kann und ein anderer möglicherweise für den Netzwerk-Overhead gewichtet wird (und zum Beispiel eine externe Abhängigkeit mit sich bringt).

Lassen Sie uns ein konkretes Beispiel geben: Berechnen Sie den Durchschnitt (arithmetisches Mittel) einer Menge von Zahlen.

Der naheliegende Ansatz besteht darin, die Eingänge zu durchlaufen und dabei eine laufende Summe und eine Zählung beizubehalten. Wenn die letzte Nummer angetroffen wird (signalisiert durch "Ende der Datei" EOF oder irgendeinen Sentinel-Wert oder irgendeine GUI-Schaltfläche, was auch immer), dann teilen wir einfach die Summe durch die Anzahl der Eingaben und wir sind fertig.

Dieser Ansatz verursacht fast keinen Overhead in Bezug auf CPU, Arbeitsspeicher oder andere Ressourcen. (Es ist eine triviale Aufgabe).

Ein anderer möglicher Ansatz ist es, die Eingabe in eine Liste zu "schlürfen". Iterieren Sie über die Liste, um die Summe zu berechnen, und teilen Sie diese durch die Anzahl der gültigen Elemente von der Liste.

Im Vergleich dazu könnte dieser Ansatz willkürliche Mengen an Speicheraufwand verursachen.

In einer bestimmten fehlerhaften Implementierung können wir die Summenoperation mit Rekursion durchführen, aber ohne Tail-Elimination. Neben dem Speicheraufwand für unsere Liste führen wir jetzt auch den Stack-Overhead ein (bei dem es sich um eine andere Art von Speicher handelt und oft eine eingeschränktere Ressource ist als andere Speicherformen).

Ein weiterer (wohl absurderer) Ansatz wäre es, alle Eingaben in eine SQL-Tabelle in einem RDBMS zu schreiben. Rufen Sie dann einfach die SQL SUM-Funktion für diese Spalte dieser Tabelle auf. Dies verschiebt unseren lokalen Speicher-Overhead auf einen anderen Server und verursacht Netzwerk-Overhead und externe Abhängigkeiten von unserer Ausführung. (Beachten Sie, dass der Remote-Server möglicherweise einen bestimmten Speicherbedarf hat oder nicht, der mit dieser Aufgabe verbunden ist. Er kann beispielsweise alle Werte sofort in den Speicher verschieben).

Hypothetisch könnte eine Implementierung über irgendeine Art von Cluster erwägen (möglicherweise um die Mittelung von Billionen von Werten durchführbar zu machen). In diesem Fall würde jede notwendige Kodierung und Verteilung der Werte (Zuordnung zu den Knoten) und die Sammlung/Kollationierung der Ergebnisse (Reduktion) als Overhead zählen.

Wir können auch über den Overhead sprechen, der durch Faktoren verursacht wird, die über den Code des Programmierers hinausgehen. Zum Beispiel könnte die Kompilierung von Code für 32- oder 64-Bit-Prozessoren einen größeren Overhead zur Folge haben als bei einer alten 8-Bit- oder 16-Bit-Architektur. Dies kann einen größeren Speicheraufwand (Ausrichtungsprobleme) oder einen CPU-Overhead (bei dem die CPU gezwungen ist, die Bit-Reihenfolge anzupassen oder nicht ausgerichtete Anweisungen zu verwenden, usw.) oder beides erforderlich machen.

Beachten Sie, dass der von Ihrem Code und seinen Bibliotheken usw. belegte Speicherplatz normalerweise nicht als "Overhead" bezeichnet wird, sondern als "Fußabdruck" bezeichnet wird. Auch der Basisspeicher, den Ihr Programm verbraucht (ohne Rücksicht auf den zu verarbeitenden Datensatz), wird auch als "Fußabdruck" bezeichnet.

28

Die Bedeutung des Wortes kann sich sehr vom Kontext unterscheiden. Im Allgemeinen werden die Ressourcen (meistens Arbeitsspeicher und CPU-Zeit) verwendet, die nicht direkt zum beabsichtigten Ergebnis beitragen, aber von der verwendeten Technologie oder Methode benötigt werden. Beispiele:

  • Protokoll-Overhead: Ethernet-Frames, IP-Pakete und TCP-Segmente haben alle Header, TCP-Verbindungen Handshake-Pakete erfordern. Daher können Sie nicht die gesamte Bandbreite verwenden, die die Hardware für Ihre tatsächlichen Daten benötigt. Sie können den Overhead reduzieren, indem Sie größere Paketgrößen verwenden, und UDP hat einen kleineren Header und keinen Handshake.
  • Datenstrukturspeicher-Overhead: Eine verknüpfte Liste erfordert mindestens einen Zeiger für jedes Element, das sie enthält. Wenn die Elemente die gleiche Größe wie ein Zeiger haben, bedeutet dies einen 50% igen Speicheraufwand, während ein Array möglicherweise einen Overhead von 0% haben kann.
  • Methodenaufruf Overhead: Ein gut konzipiertes Programm ist in viele kurze Methoden unterteilt. Jeder Methodenaufruf erfordert jedoch das Einrichten eines Stapelrahmens, das Kopieren von Parametern und eine Rückgabeadresse. Dies stellt den CPU-Overhead im Vergleich zu einem Programm dar, das alles in einer einzigen monolithischen Funktion ausführt.Natürlich macht es die zusätzliche Wartbarkeit sehr wertvoll, aber in einigen Fällen können übermäßige Methodenaufrufe erhebliche Auswirkungen auf die Leistung haben.
+0

Klingt wie das Wort hat die gleiche Bedeutung in all diesen Beispielen (erforderlich, um die Aufgabe auszuführen, aber nicht immer direkt damit zu tun) – RCIX

+0

Re Datenstruktur Speicheraufwand: Mit den meisten Speicherzuweisungen ist es noch schlimmer.Jeder von 'malloc' zurückgegebene Wert hat einen eingebauten Overhead von 8 Bytes aufgrund des Zuordners (unter Annahme einer klassischen 32-Bit-Maschine), der aus der Größe des Blocks plus Schutzwerten besteht. Und das, bevor Sie überhaupt über die Granularität der Zuweisung nachdenken. Eine einfach verknüpfte Liste von einfachen 4-Byte-Ganzzahlen wird daher einen Overhead von 75% haben; Arrays sind viel besser (es sei denn, Sie benötigen eine schnelle Einfügung in der Mitte), da sie den Overhead einmal haben können (oder weniger, wenn das Array nicht dynamisch zugewiesen wird). –

10

Sie sind müde und können nicht mehr arbeiten. Du isst Essen. Die Energie, die ausgegeben wird, um Nahrung zu suchen, sie zu bekommen und es wirklich zu essen, verbraucht Energie und ist obenliegend!

Overhead ist etwas verschwendet, um eine Aufgabe zu erfüllen. Das Ziel ist es, Overhead sehr sehr klein zu machen.

In der Informatik sagen wir, Sie wollen eine Nummer drucken, das ist Ihre Aufgabe. Aber speichern Sie die Nummer, die Einrichtung der Anzeige, um es zu drucken und Aufruf von Routinen, um es zu drucken, dann Zugriff auf die Nummer von Variable sind alle Overhead.

+1

Das ist eigentlich eine sehr gute Definition! +1 – RCIX

0

Ein konkretes Beispiel für Overhead ist der Unterschied zwischen einem "lokalen" Prozeduraufruf und einem "remote" Prozeduraufruf. Beispielsweise sieht bei einem klassischen RPC (und vielen anderen entfernten Frameworks, wie EJB) ein Funktions- oder Methodenaufruf für einen Coder gleich aus, ob es sich um einen lokalen, im Speicheraufruf oder um einen verteilten Netzwerkaufruf handelt.

Zum Beispiel:

service.function(param1, param2); 

Ist das ein normales Verfahren oder eine Remote-Methode? Von dem, was Sie hier sehen, können Sie nicht sagen.

Aber Sie können sich vorstellen, dass der Unterschied in den Ausführungszeiten zwischen den beiden Anrufen dramatisch ist.

Also, während die Kernimplementierung wird "die gleichen Kosten", die "Overhead" beteiligt ist ganz anders.

0

Denken Sie an den Overhead als die Zeit, die erforderlich ist, um die Threads zu verwalten und zwischen ihnen zu koordinieren. Es ist eine Last, wenn der Thread nicht genug Aufgaben zu erledigen hat. In einem solchen Fall übersteigen die Overhead-Kosten die eingesparte Zeit durch Verwendung von Threading und der Code benötigt mehr Zeit als der sequentielle.