Qu'est-ce qu'un overhead? Existe-t-il plusieurs types de frais généraux, ou un seul? Quels sont quelques exemples?Qu'est-ce que "overhead"?
Répondre
La signification commerciale du coût overhead l'explique mieux. Un article de Wikipédia:
Les frais généraux à long terme est habituellement utilisé pour frais de groupe qui sont nécessaires pour le fonctionnement continu de l'entreprise , mais ne peut pas être immédiatement associé aux produits/services offerts 1 (par exemple faire pas directement générer des profits).
Le surcoût est un "coût" que vous devrez engager pour pouvoir effectuer une opération; vous devez "investir" une ressource pour effectuer l'opération en question.
Le surcoût est l'utilisation d'une ressource particulière qui est un effet secondaire de ce que vous tentez réellement d'accomplir. par exemple. Le remplissage de structure est une forme de surcharge de mémoire. Pousser et sauter des arguments sur la pile est une forme de surcharge de traitement. Les en-têtes de paquets sont une forme de surcharge de bande passante. Pensez à une ressource, elle peut être associée à un surcoût.
Je ne dirais pas "indésirable" mais plutôt comme "effet secondaire". – tenfour
@tenfour: Oui, c'est beaucoup mieux. J'ai travaillé cela dans ma réponse. –
Voici un exemple des frais généraux de taille pour les structures et les classes:
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 la première structure, les caractères environnants (un octet chacun) amènent le compilateur à "pousser" l'int vers le bas de sorte qu'il puisse être accédé comme un mot entier (quatre octets). La deuxième structure n'exige pas autant de poussée.
Moralité de l'histoire: placez les membres de données de taille similaire l'un à côté de l'autre.
Voici un exemple des frais généraux de temps, liée à 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 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 est constitué par:
real 0m5.489s
user 0m5.436s
sys 0m0.040s
C'est beaucoup plus rapide car les itérations de la boucle sont plus en ligne avec l'ordre des indices de la matrice. Ainsi, les données sont plus susceptibles d'être accédées consécutivement, et donc plus susceptibles d'être disponibles dans le cache.
Google Définir frais généraux: http://www.google.com/search?hl=fr&safe=off&defl=fr&q=define:overhead&sa=X&ei=x1C7TOyFOIP-8Ab18pmHDw&ved=0CBIQkAE –