Was ist „über Kopf“? [geschlossen]
-
08-10-2019 - |
Frage
Was ist Overhead? Gibt es mehrere Arten von Kopf oder nur eine? Was sind einige Beispiele?
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.