Domanda
Che cosa è in testa? Ci sono più tipi di spese generali, o uno solo? Quali sono alcuni esempi?
Soluzione
Il significato commerciale di costo in testa lo spiega meglio. Da Wikipedia:
Il termine in testa è di solito utilizzato per spese del gruppo che sono necessari per il continuo funzionamento del affari, ma non può essere immediatamente associati ai prodotti / servizi offerti 1 (ad esempio non fare direttamente generare profitti).
Lavagna è un "costo" si dovranno sostenere di essere in grado di eseguire un'operazione; è necessario "investire" qualche risorsa per eseguire l'operazione in questione.
Altri suggerimenti
Le spese generali sono qualsiasi utilizzo di una particolare risorsa che è un effetto collaterale di ciò che si sta effettivamente cercando di raggiungere. per esempio. imbottitura struct è una forma di overhead di memoria. Spingendo e popping argomenti sullo stack è una forma di elaborazione overhead. header dei pacchetti sono una forma di overhead di banda. Pensate a una risorsa, si può avere un overhead associato con esso.
Ecco un esempio di dimensioni overhead per le strutture e le classi:
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;
}
Il risultato è:
Size of first: 12
Size of second: 8
Il compilatore deve costruire una struttura per essere parola-allineati. Nel primo struct, del char circostante (un byte ciascuno) causa il compilatore di "spinta" int in modo che possa essere letta come una parola completa (quattro byte). Il secondo struct non richiede quasi quanto spingendo.
Morale della storia:. Membri di dati posto simile a grandezza naturale accanto all'altro
Ecco un esempio di tempo di overhead, relative a un migliore utilizzo delle località di sfruttare la cache:
#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;
}
L'esecuzione di questo sulla mia macchina prende questo molto tempo:
real 0m35.137s
user 0m34.996s
sys 0m0.067s
Ora ti scambiare le iterazioni e loop j k:
#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;
}
Il tempo di esecuzione per questo è:
real 0m5.489s
user 0m5.436s
sys 0m0.040s
E 'molto più veloce perché le iterazioni del ciclo sono più in linea con l'ordine degli indici di array. Così, i dati sono più probabilità di essere raggiunto consecutivamente, e quindi più probabile che sia disponibile nella cache.