Question

Qu'est-ce que les frais généraux? Y at-il plusieurs types de frais généraux, ou un seul? Quels sont quelques exemples?

Était-ce utile?

La solution

Le sens des affaires de frais généraux explique le mieux. Un article de Wikipédia:

  

Le terme est habituellement utilisé pour les frais généraux   Les frais de groupe qui sont nécessaires pour   le fonctionnement continu du   affaires, mais ne peut pas être immédiatement   associés aux produits / services   offerts 1 (par exemple ne pas directement   générer des profits).

Les frais généraux sont un « coût » vous encourez pour être en mesure d'effectuer une opération; vous devez « investir » une ressource pour effectuer l'opération en question.

Autres conseils

Les frais généraux sont toute utilisation d'une ressource particulière qui est un effet secondaire de ce que vous essayez réellement à atteindre. par exemple. Struct rembourrage est une forme de surcharge de la mémoire. Pousser et arguments à éclater sur la pile est une forme de traitement de surdébit. les en-têtes de paquets sont une forme de surcharge de la bande passante. Pensez à une ressource, il peut avoir une surcharge associée.

Voici un exemple des frais généraux de la taille des classes et pour les structures:

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;
}

Le résultat est:

Size of first: 12
Size of second: 8

Le compilateur doit construire un struct être aligné mot. Dans le premier struct, l'omble de ses environs (un octet chacun) provoquent le compilateur de « pousser » l'int vers le bas afin qu'il puisse être accessible en tant que mot complet (quatre octets). La deuxième struct ne nécessite pas autant pousser.

Morale de l'histoire:. Endroit des membres de données-taille similaire à côté de l'autre

Voici un exemple de temps frais généraux, liés à une meilleure utilisation de la localité pour exploiter le 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'exécution de ce sur ma machine prend tout ce temps:

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

Maintenant, je vais échanger les itérations de la boucle j et 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;
}

Le moteur d'exécution pour cela est:

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

Il est beaucoup plus rapide parce que les itérations de la boucle sont plus en ligne avec l'ordre des indices de tableau. Ainsi, les données sont plus susceptibles d'être accédés de façon consécutive, et donc plus susceptibles d'être disponibles dans le cache.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top