Frage

Was ist Overhead? Gibt es mehrere Arten von Kopf oder nur eine? Was sind einige Beispiele?

War es hilfreich?

Lösung

Die betriebswirtschaftliche Bedeutung von Overhead Kosten erklärt es am besten. Aus Wikipedia:

Der Begriff Overhead in der Regel verwendet wird, um Gruppe Aufwendungen, die notwendig sind, um das weitere Funktionieren der Unternehmen, kann aber nicht sofort sein mit den Produkten / Dienstleistungen im Zusammenhang wobei angeboten 1 (z.B. nicht direkt tun Gewinne zu erzielen).

ist Overhead eine „Kosten“ Sie entstehen der Lage sein, eine Operation durchzuführen; Sie müssen eine Ressource „investieren“, um den Betrieb in Frage auszuführen.

Andere Tipps

ist Overhead jede Nutzung einer bestimmten Ressource, ist ein Nebeneffekt von dem, was Sie versuchen, tatsächlich zu erreichen. z.B. Struct padding ist eine Form von Speicher-Overhead. Schieben und Argumente auf dem Stack popping ist eine Form des Verarbeitungsaufwand. Paket-Header sind eine Form von Bandbreite-Overhead. Denken Sie an eine Ressource, kann sie haben einen Overhead mit ihr verbunden sind.

Hier ist ein Beispiel für Größe Aufwand für structs und Klassen:

struct first {
    char letter1;
    int number;
    char letter2;
};

struct second {
    int number;
    char letter1;
    char letter2;
};

int main ()
{
    cout << "Size of first: " << sizeof(first) << endl;
    cout << "Size of second: " << sizeof(second) << endl;
    return 0;
}

Das Ergebnis ist:

Size of first: 12
Size of second: 8

Der Compiler muss eine Struktur aufbauen Wort ausgerichtet sein. In der ersten struct das umliegende Char (jeweils ein Byte) Ursache der Compiler „push“ die int nach unten, so dass es als ein Vollwort zugegriffen werden kann (vier Bytes). Die zweite Struktur erfordert nicht annähernd so viel drücken.

Die Moral der Geschichte:. Ort ähnlich große Datenelemente nebeneinander

Hier ist ein Beispiel von Zeitaufwand, um eine bessere Nutzung des Ortes im Zusammenhang den Cache zu nutzen:

#include <stdio.h>

#define SIZE 1024

double A[SIZE][SIZE], B[SIZE][SIZE], C[SIZE][SIZE];

int main ()
{
    int i, j, k;

    for (i = 0; i < SIZE; i++) {
        for (j = 0; j < SIZE; j++) {
            for (k = 0; k < SIZE; k++) {
                C[i][j] += A[i][k] * B[k][j];
            }
        }
    }

    return 0;
}

Ausführen dieses auf meinem Rechner so viel Zeit in Anspruch nimmt:

real    0m35.137s
user    0m34.996s
sys     0m0.067s

Jetzt werde ich die j und k Schleifendurchläufe tauschen:

#include <stdio.h>

#define SIZE 1024

double A[SIZE][SIZE], B[SIZE][SIZE], C[SIZE][SIZE];

int main ()
{
    int i, j, k;

    for (i = 0; i < SIZE; i++) {
        for (k = 0; k < SIZE; k++) {            // this is the only change
            for (j = 0; j < SIZE; j++) {
                C[i][j] += A[i][k] * B[k][j];
            }
        }
   }

   return 0;
}

Die Laufzeit hierfür ist:

real    0m5.489s
user    0m5.436s
sys     0m0.040s

Es ist viel schneller, weil die Schleifendurchläufe mehr in-line mit der Reihenfolge des Array-Indizes sind. Somit ist die Daten eher nacheinander zugegriffen werden, und somit eher im Cache zur Verfügung steht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top