Qu'est-ce que «overhead»?


149

Je suis étudiant en informatique et j'entends souvent le mot «overhead» quand il s'agit de programmes et de sortes. Qu'est-ce que cela signifie exactement?


27
combien de "trucs supplémentaires" vous devez faire pour obtenir quelque chose. par exemple, si je dois charger un projet de 37 classes juste pour imprimer "Hello World", je considérerais cela comme beaucoup de frais généraux.
scunliffe

1
@ doug65536 En fait, c'est l'inverse. =)
Yukio Fukuzawa

Réponses:


177

Ce sont les ressources nécessaires pour mettre en place une opération. Cela peut sembler sans rapport, mais nécessaire.

C'est comme si vous avez besoin d'aller quelque part, vous pourriez avoir besoin d'une voiture. Mais il y aurait beaucoup de frais généraux à faire conduire une voiture dans la rue, alors vous voudrez peut-être marcher. Cependant, les frais généraux en valent la peine si vous traversez le pays.

En informatique, nous utilisons parfois des voitures pour descendre la rue parce que nous n'avons pas de meilleur chemin, ou cela ne vaut pas la peine «d'apprendre à marcher».


84
Une analogie similaire serait le vol. Les avions sont beaucoup plus rapides que les voitures, mais les frais généraux liés à l'enregistrement à l'aéroport, à la sécurité, etc. font des voitures une meilleure option pour les distances plus courtes.
FogleBird

s / drive / go / (Si vous avez besoin de conduire quelque part, vous ne décidez généralement pas de marcher ...
RCIX

1
@ inf3rno L'ironie? Comment arriver à notre voiture? Nous marchons. Et nous pouvons totalement marcher ... jusqu'à notre voiture. Nous ne pouvons pas marcher jusqu'à notre destination, même si elle est plus proche que notre voiture.
corsiKa

Si je devais dire que j'écris du code Java à faible surcharge, comment interpréteriez-vous cela en termes de définition des «ressources nécessaires pour mettre en place une opération». Mon code ne nécessite pas beaucoup de configuration?
committedandroider

Eh bien, vous devez allumer l'ordinateur ou le serveur, vous devez charger le système d'exploitation et tous les pilotes, vous devez lancer le processus Java, vous devez activer la JVM, vous devez charger toutes vos classes, vous devez synchroniser le tampon IO avec la console juste pour que vous puissiez faire votre "hello world". Mais s'il vous plaît, dites-moi plus sur le codage à faible surcharge.
corsiKa

40

Le sens du mot peut différer beaucoup selon le contexte. En général, ce sont les ressources (le plus souvent la mémoire et le temps processeur) qui sont utilisées, qui ne contribuent pas directement au résultat attendu, mais qui sont requises par la technologie ou la méthode utilisée. Exemples:

  • Surcharge du protocole : les trames Ethernet, les paquets IP et les segments TCP ont tous des en-têtes, les connexions TCP nécessitent des paquets de prise de contact. Ainsi, vous ne pouvez pas utiliser toute la bande passante dont le matériel est capable pour vos données réelles. Vous pouvez réduire la surcharge en utilisant des tailles de paquet plus grandes et UDP a un en-tête plus petit et aucune poignée de main.
  • Surcharge mémoire de structure de données : une liste chaînée nécessite au moins un pointeur pour chaque élément qu'elle contient. Si les éléments ont la même taille qu'un pointeur, cela signifie une surcharge de mémoire de 50%, alors qu'un tableau peut potentiellement avoir une surcharge de 0%.
  • Frais généraux d'appel de méthode : un programme bien conçu est divisé en plusieurs méthodes courtes. Mais chaque appel de méthode nécessite la mise en place d'un frame de pile, la copie de paramètres et une adresse de retour. Cela représente la surcharge du processeur par rapport à un programme qui fait tout dans une seule fonction monolithique. Bien sûr, la maintenabilité supplémentaire en vaut la peine, mais dans certains cas, des appels de méthode excessifs peuvent avoir un impact significatif sur les performances.

On dirait que le mot a le même sens dans tous ces exemples (nécessaire pour exécuter la tâche, mais pas toujours lié à la faire directement)
RCIX

Surcharge mémoire de la structure des données: avec la plupart des allocateurs de mémoire, c'est encore pire que cela. Chaque valeur renvoyée par malloca une surcharge intégrée de 8 octets en raison de l'allocateur (en supposant une machine 32 bits classique) consistant en la taille du bloc plus les valeurs de garde. Et c'est avant même de penser à la granularité d'allocation. Une liste à liaison simple d'entiers simples de 4 octets aura donc une surcharge de 75%; les tableaux sont bien meilleurs (sauf si vous avez besoin d'une insertion rapide au milieu) car ils peuvent avoir la surcharge une fois (ou moins, si le tableau n'est pas alloué dynamiquement).
Donal Fellows

19

Vous êtes fatigué et ne pouvez plus travailler. Vous mangez de la nourriture. L'énergie dépensée à chercher de la nourriture, à l'obtenir et à la manger, consomme de l'énergie et est au-dessus de votre tête!

Les frais généraux sont quelque chose de gaspillé pour accomplir une tâche. Le but est de rendre les frais généraux très très faibles.

En informatique, disons que vous souhaitez imprimer un nombre, c'est votre tâche. Mais stocker le numéro, configurer l'affichage pour l'imprimer et appeler des routines pour l'imprimer, puis accéder au numéro à partir de la variable sont tous des frais généraux.


17

Wikipedia nous a couvert :

En informatique, la surcharge est généralement considérée comme toute combinaison de temps de calcul excessif ou indirect, de mémoire, de bande passante ou d'autres ressources nécessaires pour atteindre un objectif particulier. C'est un cas particulier de frais généraux d'ingénierie.


4
Mais si ce n'était pas le cas, vous corrigeriez WikiPedia, puis publieriez le même message ici.
SamGoody

11

Les frais généraux se réfèrent généralement à la quantité de ressources supplémentaires (mémoire, processeur, temps, etc.) que prennent différents algorithmes de programmation.

Par exemple, la surcharge de l'insertion dans un arbre binaire équilibré pourrait être beaucoup plus grande que la même insertion dans une simple liste liée (l'insertion prendra plus de temps, utilise plus de puissance de traitement pour équilibrer l'arbre, ce qui se traduit par un temps d'opération perçu plus long en l'utilisateur).


5

Pour un programmeur, la surcharge fait référence aux ressources système qui sont consommées par votre code lorsqu'il s'exécute sur une plate-forme donnant sur un ensemble donné de données d'entrée. Habituellement, le terme est utilisé dans le contexte de la comparaison de différentes implémentations ou implémentations possibles.

Par exemple, nous pourrions dire qu'une approche particulière pourrait entraîner une surcharge du processeur considérable, tandis qu'une autre pourrait entraîner une surcharge de mémoire supplémentaire et une autre encore pourrait être pondérée par la surcharge du réseau (et entraîner une dépendance externe, par exemple).

Donnons un exemple spécifique: calculez la moyenne (moyenne arithmétique) d'un ensemble de nombres.

L'approche évidente consiste à effectuer une boucle sur les entrées, en conservant un total cumulé et un décompte. Quand le dernier nombre est rencontré (signalé par "fin de fichier" EOF, ou une valeur sentinelle, ou un bouton GUI, peu importe) alors nous divisons simplement le total par le nombre d'entrées et nous avons terminé.

Cette approche n'entraîne pratiquement aucune surcharge en termes de CPU, de mémoire ou d'autres ressources. (C'est une tâche triviale).

Une autre approche possible consiste à "slurp" l'entrée dans une liste. Parcourez la liste pour calculer la somme, puis divisez-la par le nombre d'éléments valides de la liste.

Par comparaison, cette approche peut entraîner des quantités arbitraires de surcharge de mémoire.

Dans une mauvaise implémentation particulière, nous pourrions effectuer l'opération de somme en utilisant la récursivité mais sans élimination de la queue. Maintenant, en plus de la surcharge de mémoire pour notre liste, nous introduisons également une surcharge de pile (qui est un type de mémoire différent et est souvent une ressource plus limitée que les autres formes de mémoire).

Une autre approche (sans doute plus absurde) consisterait à publier toutes les entrées dans une table SQL dans un SGBDR. Ensuite, appelez simplement la fonction SQL SUM sur cette colonne de cette table. Cela déplace notre surcharge de mémoire locale vers un autre serveur et entraîne une surcharge du réseau et des dépendances externes sur notre exécution. (Notez que le serveur distant peut ou non avoir une surcharge de mémoire particulière associée à cette tâche - il peut pousser toutes les valeurs immédiatement vers le stockage, par exemple).

Hypothétiquement pourrait envisager une implémentation sur une sorte de cluster (éventuellement pour rendre possible la moyenne de trillions de valeurs). Dans ce cas, tout codage et distribution nécessaires des valeurs (les mappant vers les nœuds) et la collecte / collation des résultats (réduction) compteraient comme une surcharge.

Nous pouvons également parler de la surcharge engendrée par des facteurs au-delà du propre code du programmeur. Par exemple, la compilation de certains codes pour des processeurs 32 ou 64 bits peut entraîner une surcharge plus importante que ce que l'on verrait pour une ancienne architecture 8 bits ou 16 bits. Cela peut impliquer une surcharge de mémoire plus importante (problèmes d'alignement) ou une surcharge du processeur (où le processeur est obligé d'ajuster l'ordre des bits ou d'utiliser des instructions non alignées, etc.) ou les deux.

Notez que l'espace disque occupé par votre code et ses bibliothèques, etc. n'est généralement pas appelé «surcharge» mais plutôt «empreinte». De plus, la mémoire de base que votre programme consomme (sans égard à tout ensemble de données qu'il traite) est également appelée son «empreinte».


3

La surcharge est simplement la plus grande consommation de temps dans l'exécution du programme. Exemple ; lorsque nous appelons une fonction et que son contrôle est passé là où il est défini, puis que son corps est exécuté, cela signifie que nous faisons exécuter notre CPU à travers un long processus (en passant d'abord le contrôle à un autre endroit de la mémoire, puis en l'exécutant ici et ensuite en passant le contrôle à l'ancienne position), par conséquent, cela prend beaucoup de temps de performance, d'où les frais généraux. Nos objectifs sont de réduire cette surcharge en utilisant l'inline pendant la définition de la fonction et le temps d'appel, qui copie le contenu de la fonction lors de l'appel de fonction, donc nous ne passons pas le contrôle à un autre emplacement, mais continuons notre programme en ligne, donc en ligne .


2

Vous pouvez utiliser un dictionnaire. La définition est la même. Mais pour vous faire gagner du temps, les frais généraux sont le travail nécessaire pour effectuer le travail productif. Par exemple, un algorithme s'exécute et fait un travail utile, mais nécessite de la mémoire pour faire son travail. Cette allocation de mémoire prend du temps et n'est pas directement liée au travail en cours, elle est donc une surcharge.


1

Vous pouvez consulter Wikipedia . Mais surtout lorsque plus d'actions ou de ressources sont utilisées. Comme si vous êtes familier avec .NET, vous pouvez avoir des types valeur et des types référence. Les types référence ont une surcharge de mémoire car ils nécessitent plus de mémoire que les types valeur.


1

Un exemple concret de surdébit est la différence entre un appel de procédure "local" et un appel de procédure "distant".

Par exemple, avec le RPC classique (et de nombreux autres frameworks distants, comme EJB), un appel de fonction ou de méthode ressemble à un codeur, qu'il s'agisse d'un appel réseau local, en mémoire ou distribué.

Par exemple:

service.function(param1, param2);

Est-ce une méthode normale ou une méthode à distance? D'après ce que vous voyez ici, vous ne pouvez pas le dire.

Mais vous pouvez imaginer que la différence de temps d'exécution entre les deux appels est dramatique.

Ainsi, alors que la mise en œuvre de base "coûtera le même prix", les "frais généraux" impliqués sont très différents.


1

Considérez les frais généraux comme le temps nécessaire pour gérer les threads et coordonner entre eux. C'est un fardeau si le thread n'a pas assez de tâche à faire. Dans un tel cas, les frais généraux dépassent le temps gagné grâce à l'utilisation du threading et le code prend plus de temps que le séquentiel.


-2

c'est autre chose que les données elles-mêmes, c'est-à-dire les drapeaux tcp, les en-têtes, crc, fcs, etc.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.