Was ist "Overhead"?


149

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


27
wie viel "extra Zeug" müssen Sie tun, um etwas zu bekommen. zB Wenn ich ein 37-Klassen-Projekt laden muss, um "Hello World" zu drucken, würde ich das als viel Aufwand betrachten.
Scunliffe

1
@ Doug65536 Eigentlich ist es umgekehrt. =)
Yukio Fukuzawa

Antworten:


177

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

Es ist wie wenn Sie irgendwohin müssen, brauchen Sie vielleicht ein Auto. Aber es wäre viel Aufwand, ein Auto die Straße entlang fahren zu lassen, also möchten Sie vielleicht laufen. Der Aufwand würde sich jedoch lohnen, wenn Sie quer durch das Land fahren würden.

In der Informatik benutzen wir manchmal Autos, um die Straße entlang zu fahren, weil wir keinen besseren Weg haben, oder es lohnt sich nicht, "laufen zu lernen".


84
Eine ähnliche Analogie wäre fliegen. Flugzeuge sind viel schneller als Autos, aber der Aufwand für das Einchecken am Flughafen, die Sicherheit usw. macht Autos zu einer besseren Option für kürzere Entfernungen.
FogleBird

s / drive / go / (Wenn Sie irgendwohin fahren müssen, entscheiden Sie sich normalerweise nicht zu Fuß ...
RCIX

1
@ inf3rno Die Ironie? Wie kommen wir zu unserem Auto? Wir gehen. Und wir können total laufen ... zu unserem Auto. Wir können unser Ziel nicht erreichen, auch wenn es näher als unser Auto ist.
CorsiKa

Wenn ich sagen würde, dass ich Java-Code mit geringem Overhead schreibe, wie würden Sie das in Bezug auf die Definition von "Ressourcen, die zum Einrichten einer Operation erforderlich sind" interpretieren. Mein Code erfordert nicht viel Setup?
committedandroider

Nun, Sie müssen den Computer oder Server einschalten, Sie müssen das Betriebssystem und alle Treiber laden, Sie müssen den Java-Prozess starten, Sie müssen die JVM einschalten, Sie müssen alle Ihre Klassen laden, Sie Sie müssen den E / A-Puffer mit der Konsole synchronisieren, damit Sie Ihre "Hallo Welt" machen können. Aber bitte erzählen Sie mir mehr über Low-Overhead-Codierung.
CorsiKa

40

Die Bedeutung des Wortes kann je nach Kontext sehr unterschiedlich sein. Im Allgemeinen werden Ressourcen (meistens Speicher und CPU-Zeit) verwendet, die nicht direkt zum beabsichtigten Ergebnis beitragen, sondern von der verwendeten Technologie oder Methode benötigt werden. Beispiele:

  • Protokoll-Overhead : Ethernet-Frames, IP-Pakete und TCP-Segmente haben alle Header, TCP-Verbindungen erfordern Handshake-Pakete. Daher können Sie nicht die gesamte Bandbreite der Hardware für Ihre tatsächlichen Daten nutzen. Sie können den Overhead reduzieren, indem Sie größere Pakete verwenden. UDP hat einen kleineren Header und keinen Handshake.
  • Overhead des Datenstrukturspeichers : Eine verknüpfte Liste erfordert mindestens einen Zeiger für jedes Element, das sie enthält. Wenn die Elemente dieselbe Größe wie ein Zeiger haben, bedeutet dies einen Speicheraufwand von 50%, während ein Array möglicherweise einen Overhead von 0% haben kann.
  • Overhead für Methodenaufrufe : Ein gut gestaltetes Programm ist in viele kurze Methoden unterteilt. Für jeden Methodenaufruf müssen jedoch ein Stapelrahmen eingerichtet, Parameter und eine Rücksprungadresse kopiert werden. Dies stellt den CPU-Overhead im Vergleich zu einem Programm dar, das alles in einer einzigen monolithischen Funktion ausführt. Die zusätzliche Wartbarkeit lohnt sich natürlich sehr, aber in einigen Fällen können übermäßige Methodenaufrufe erhebliche Auswirkungen auf die Leistung haben.

Klingt so, als hätte das Wort in all diesen Beispielen die gleiche Bedeutung (notwendig, um die Aufgabe auszuführen, aber nicht immer direkt damit verbunden)
RCIX

Speicheraufwand für die Datenstruktur: Bei den meisten Speicherzuordnungen ist dies sogar noch schlimmer. Jeder von zurückgegebene Wert mallochat einen integrierten Overhead von 8 Bytes, da der Allokator (unter der Annahme einer klassischen 32-Bit-Maschine) aus der Größe des Blocks plus Schutzwerten besteht. Und das ist, bevor Sie überhaupt über die Granularität der Zuordnung nachdenken. Eine einfach verknüpfte Liste einfacher 4-Byte-Ganzzahlen hat daher einen Overhead von 75%. Arrays sind viel besser (es sei denn, Sie müssen sie schnell in die Mitte einfügen), da sie den Overhead einmal haben können (oder weniger, wenn das Array nicht dynamisch zugewiesen wird).
Donal Fellows

19

Du bist müde und kannst keine Arbeit mehr machen. Du isst Essen. Die Energie, die aufgewendet wird, um nach Nahrung zu suchen, sie zu bekommen und sie tatsächlich zu essen, verbraucht Energie und ist Overhead!

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

Nehmen wir in der Informatik an, Sie möchten eine Zahl drucken, das ist Ihre Aufgabe. Das Speichern der Nummer, das Einrichten der Anzeige zum Drucken und das Aufrufen von Routinen zum Drucken und der anschließende Zugriff auf die Nummer über eine Variable sind jedoch alle Kosten.


17

Wikipedia hat uns abgedeckt :

In der Informatik wird Overhead im Allgemeinen als eine Kombination aus überschüssiger oder indirekter Rechenzeit, Speicher, Bandbreite oder anderen Ressourcen betrachtet, die zur Erreichung eines bestimmten Ziels erforderlich sind. Es ist ein Sonderfall von Engineering-Overhead.


4
Wenn dies nicht der Fall wäre, würden Sie WikiPedia reparieren und dann denselben Beitrag hier verfassen.
SamGoody

11

Overhead bezieht sich normalerweise auf die Menge an zusätzlichen Ressourcen (Speicher, Prozessor, Zeit usw.), die verschiedene Programmieralgorithmen benötigen.

Beispielsweise kann der Aufwand für das Einfügen in einen ausgeglichenen Binärbaum viel größer sein als der Aufwand für das Einfügen in eine einfache verknüpfte Liste (das Einfügen dauert länger, verbrauchen Sie mehr Rechenleistung, um den Baum auszugleichen, was zu einer längeren wahrgenommenen Betriebszeit von führt der Nutzer).


5

Für einen Programmierer bezieht sich Overhead auf diejenigen Systemressourcen, die von Ihrem Code verbraucht werden, wenn er auf einer bestimmten Plattform für einen bestimmten Satz von Eingabedaten ausgeführt wird. Normalerweise wird der Begriff im Zusammenhang mit dem Vergleich verschiedener Implementierungen oder möglicher Implementierungen verwendet.

Zum Beispiel könnten wir sagen, dass ein bestimmter Ansatz einen erheblichen CPU-Overhead verursachen könnte, während ein anderer mehr Speicher-Overhead verursachen könnte und ein anderer auf den Netzwerk-Overhead gewichtet sein könnte (und zum Beispiel eine externe Abhängigkeit mit sich bringen würde).

Geben wir ein konkretes Beispiel: Berechnen Sie den Durchschnitt (arithmetisches Mittel) einer Reihe 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 Zahl gefunden wird (signalisiert durch "Ende der Datei" EOF oder einen Sentinel-Wert oder einen GUI-Buttom, was auch immer), dividieren wir einfach die Summe durch die Anzahl der Eingaben und fertig.

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

Ein anderer möglicher Ansatz besteht darin, die Eingabe in eine Liste zu "schlürfen". Durchlaufen Sie die Liste, um die Summe zu berechnen, und dividieren Sie diese durch die Anzahl der gültigen Elemente aus der Liste.

Im Vergleich dazu kann dieser Ansatz einen beliebigen Speicheraufwand verursachen.

In einer besonders schlechten Implementierung können wir die Summenoperation unter Verwendung von Rekursion ausführen, jedoch ohne Endeliminierung. Zusätzlich zum Speicher-Overhead für unsere Liste führen wir jetzt auch den Stack-Overhead ein (dies ist eine andere Art von Speicher und häufig eine begrenzte Ressource als andere Speicherformen).

Ein weiterer (wohl absurderer) Ansatz wäre, alle Eingaben in eine SQL-Tabelle in einem RDBMS zu stellen. 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 dem Remote-Server möglicherweise ein bestimmter Speicheraufwand für diese Aufgabe zugeordnet ist oder nicht. Beispielsweise werden möglicherweise alle Werte sofort in den Speicher verschoben.)

Hypothetisch könnte eine Implementierung über eine Art Cluster in Betracht gezogen werden (möglicherweise, um die Mittelung von Billionen von Werten möglich zu machen). In diesem Fall würde jede notwendige Codierung und Verteilung der Werte (Zuordnung zu den Knoten) und die Erfassung / Zusammenstellung der Ergebnisse (Reduzierung) als Overhead gelten.

Wir können auch über den Overhead sprechen, der durch Faktoren entsteht, die über den eigenen Code des Programmierers hinausgehen. Beispielsweise kann das Kompilieren von Code für 32- oder 64-Bit-Prozessoren einen höheren Overhead verursachen als bei einer alten 8-Bit- oder 16-Bit-Architektur. Dies kann einen größeren Speicheraufwand (Ausrichtungsprobleme) oder einen größeren CPU-Overhead (bei dem die CPU gezwungen ist, die Bitreihenfolge anzupassen oder nicht ausgerichtete Anweisungen usw. zu verwenden) oder beides beinhalten.

Beachten Sie, dass der von Ihrem Code und seinen Bibliotheken usw. belegte Speicherplatz normalerweise nicht als "Overhead", sondern als "Footprint" bezeichnet wird. Auch der Basisspeicher, den Ihr Programm verbraucht (unabhängig von einem Datensatz, den es verarbeitet), wird als "Footprint" bezeichnet.


3

Overhead ist einfach der höhere Zeitaufwand bei der Programmausführung. Beispiel; Wenn wir eine Funktion aufrufen und ihre Steuerung dort übergeben wird, wo sie definiert ist, und dann ihr Körper ausgeführt wird, bedeutet dies, dass unsere CPU einen langen Prozess durchläuft (zuerst wird die Steuerung an eine andere Stelle im Speicher übergeben und dann dort und dann ausgeführt Wenn die Steuerung an die vorherige Position zurückgegeben wird, dauert es folglich viel Leistungszeit, daher Overhead. Unser Ziel ist es, diesen Overhead zu reduzieren, indem wir die Inline während der Funktionsdefinition und der Aufrufzeit verwenden, wodurch der Inhalt der Funktion beim Funktionsaufruf kopiert wird. Daher übergeben wir das Steuerelement nicht an einen anderen Ort, sondern setzen unser Programm in einer Zeile fort, also inline .


2

Sie könnten ein Wörterbuch verwenden. Die Definition ist dieselbe. Um Ihnen Zeit zu sparen, ist Overhead die Arbeit, die für die produktive Arbeit erforderlich ist. Zum Beispiel wird ein Algorithmus ausgeführt und leistet nützliche Arbeit, benötigt jedoch Speicher, um seine Arbeit zu erledigen. Diese Speicherzuweisung nimmt Zeit in Anspruch und steht nicht in direktem Zusammenhang mit der ausgeführten Arbeit, ist also Overhead.


1

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


1

Ein konkretes Beispiel für Overhead ist der Unterschied zwischen einem "lokalen" Prozeduraufruf und einem "entfernten" Prozeduraufruf.

Bei klassischem RPC (und vielen anderen Remote-Frameworks wie EJB) sieht ein Funktions- oder Methodenaufruf für einen Codierer beispielsweise gleich aus, unabhängig davon, ob es sich um einen lokalen Aufruf im Speicher oder einen verteilten Netzwerkaufruf handelt.

Beispielsweise:

service.function(param1, param2);

Ist das eine normale Methode oder eine entfernte Methode? An dem, was Sie hier sehen, können Sie nichts erkennen.

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

Während die Kernimplementierung "gleich viel kostet", ist der damit verbundene "Overhead" ganz anders.


1

Stellen Sie sich den Overhead als die Zeit vor, die erforderlich ist, um die Threads zu verwalten und zwischen ihnen zu koordinieren. Es ist eine Belastung, wenn der Thread nicht genügend Aufgaben hat. In einem solchen Fall übersteigen die Gemeinkosten die eingesparte Zeit durch Threading, und der Code benötigt mehr Zeit als der sequentielle.


-2

Es ist alles andere als die Daten selbst, dh TCP-Flags, Header, CRC, FCS usw.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.