Qu'est-ce que "overhead"?
Je suis un étudiant en informatique et j'entends beaucoup le mot "overhead" quand il s'agit de programmes et de sortes. Qu'est-ce que cela signifie exactement?
11 réponses
Ce sont les ressources nécessaires pour configurer une opération. Cela peut sembler sans rapport, mais nécessaire.
C'est comme quand vous avez besoin d'aller quelque part, vous pourriez avoir besoin d'une voiture. Mais, il serait beaucoup de frais généraux pour obtenir une voiture à conduire dans la rue, de sorte que vous pourriez vouloir marcher. Cependant, les frais généraux seraient la peine si vous alliez à travers le pays.
En informatique, nous utilisons parfois des voitures pour descendre dans la rue parce que nous n'avons pas de meilleur moyen, ou que cela ne vaut pas la peine "apprendre à marcher".
La signification du mot peut différer beaucoup avec le contexte. En général, ce sont les ressources (le plus souvent la mémoire et le temps CPU) qui sont utilisées, qui ne contribuent pas directement au résultat escompté, mais qui sont requises par la technologie ou la méthode utilisée. Exemples:
- surcharge de 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 vos données réelles. Vous pouvez réduire la surcharge en utilisant des tailles de paquets plus grandes et UDP a un en-tête plus petit et aucune poignée de main.
- surcharge de la mémoire de la structure de données : une liste lié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 décomposé en beaucoup de méthodes courtes. Mais chaque appel de méthode nécessite la configuration d'un cadre 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é ajoutée en vaut la peine, mais dans certains cas, des appels de méthode excessifs peuvent avoir un impact significatif sur les performances.
Wikipedia nous a couverts:
En informatique, surcharge est généralement considéré comme toute combinaison de calcul excessif ou indirect temps, mémoire, bande passante ou autre les ressources qui sont nécessaires pour atteindre un objectif particulier. Il est un spécial cas de l'ingénierie de frais généraux.
Tu es fatigué et tu ne peux plus travailler. Vous mangez de la nourriture. L'énergie dépensée à la recherche de nourriture, à l'obtenir et à la manger consomme de l'énergie et est en frais généraux!
Les frais généraux sont quelque chose de gaspillé pour accomplir une tâche. L'objectif est de rendre les frais généraux très très petits.
En informatique, disons que vous voulez imprimer un numéro, c'est votre tâche. Mais stocker le numéro, la configuration de l'affichage pour l'imprimer et appeler des routines pour l'imprimer, puis accéder au numéro de variable sont tous les frais généraux.
Les frais généraux se rapportent généralement à la quantité de ressources supplémentaires (Mémoire, Processeur, Temps, etc.) que différents algorithmes de programmation prennent.
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, utilisera plus de puissance de traitement pour équilibrer l'arbre, ce qui se traduira par un temps de fonctionnement plus long par l'utilisateur).
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 CPU considérable tandis qu'une autre pourrait encourir plus de frais généraux de mémoire et une autre pourrait être pondérée en frais généraux du réseau (et entraîner une surcharge externe). la dépendance, par exemple).
Donnons un exemple spécifique: Calculez la moyenne (moyenne arithmétique) d'un ensemble de nombres.
L'approche évidente est de faire une boucle sur les entrées, en gardant un total et de comptage. Lorsque le dernier nombre est rencontré (signalé par "fin de fichier" EOF, ou une valeur sentinelle, ou un bouton GUI, peu importe), nous divisons simplement le total par le nombre d'entrées et nous avons terminé.
Cette approche n'entraîne presque aucune surcharge en termes de CPU, de mémoire ou de 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.
En comparaison, cette approche peut entraîner des quantités arbitraires de surcharge de mémoire.
Dans une implémentation incorrecte particulière, nous pouvons effectuer l'opération sum en utilisant la récursivité mais sans élimination de queue. Maintenant, en plus de la surcharge de mémoire pour notre liste, nous sommes introduction également de la 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)serait de poster toutes les entrées dans une table SQL dans un SGBDR. Ensuite, il suffit d'appeler 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 réseau et des dépendances externes sur notre exécution. (Notez que le serveur distant peut ou peut ne pas avoir de surcharge de mémoire particulière associée à cette tâche - - - il pourrait pousser toutes les valeurs immédiatement dans le stockage, par exemple).
Hypothétiquement pourrait envisager une implémentation sur une sorte de cluster (éventuellement pour rendre la moyenne de billions de valeurs réalisable). Dans ce cas, tout codage et distribution nécessaires des valeurs (en les mappant aux nœuds) et la collecte/collation des résultats (réduction) compteraient comme frais généraux.
On peut parlez également des frais généraux encourus par des facteurs au-delà du propre code du programmeur. Par exemple, la compilation de code pour les processeurs 32 ou 64 bits peut entraîner une surcharge supérieure à celle 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 forcé 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. être pas généralement appelé "frais généraux", mais est plutôt appelé " empreinte."En outre, la mémoire de base que votre programme consomme (sans tenir compte de tout ensemble de données qu'il traite) s'appelle également son "empreinte".
Vous pouvez utiliser un dictionnaire. La définition est la même. Mais pour gagner du temps, la charge de travail nécessaire pour faire le travail productif. Par exemple, un algorithme court et fait un travail utile, mais nécessite de la mémoire de travail. Cette allocation de mémoire prend du temps, et n'est pas directement liée au travail en cours, est donc en surcharge.
Vous pouvez vérifier Wikipedia. Mais surtout quand plus d'actions ou de ressources sont utilisées. Comme si vous êtes familier avec. Net, vous pouvez avoir des types de valeur et des types de référence. Les types de référence ont une surcharge de mémoire car ils nécessitent plus de mémoire que les types de valeur.
Un exemple concret de surcharge est la différence entre un appel de procédure " local "et un appel de procédure" distant".
Par exemple, avec 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 local en mémoire ou d'un appel réseau distribué.
Par exemple:
service.function(param1, param2);
Est-ce une méthode normale ou une méthode distante? De ce que vous voyez ici, vous ne pouvez pas dire.
Mais vous pouvez imaginer que le différence de temps d'exécution entre les deux appels sont dramatiques.
Ainsi, alors que la mise en œuvre de base "coûtera la même chose", les "frais généraux" impliqués sont assez différents.
Pensez à la surcharge 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 viennent sur le temps gagné grâce à l'utilisation du threading et le code prend plus de temps que le séquentiel.
C'est autre chose que les données elles-mêmes, c'est-à-dire les drapeaux tcp, les en-têtes, crc, fcs, etc..