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?
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?
Antworten:
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".
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:
malloc
hat 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).
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.
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.
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).
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.
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 .
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.
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.
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.
Es ist alles andere als die Daten selbst, dh TCP-Flags, Header, CRC, FCS usw.