Domanda

Che cosa è in testa? Ci sono più tipi di spese generali, o uno solo? Quali sono alcuni esempi?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top