Qu’est-ce qu’un “overhead”?

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?

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 deviez aller quelque part, vous pourriez avoir besoin d’une voiture. Mais il serait très difficile de prendre une voiture pour descendre dans la rue, alors vous pourriez vouloir marcher. Cependant, les frais généraux en valaient la peine si vous traversiez 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 d’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 processeur) qui sont utilisées, qui ne consortingbuent pas directement au résultat escompté, mais qui sont requirejses par la technologie ou la méthode utilisée. Exemples:

  • En-tête 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 pour vos données réelles. Vous pouvez réduire la surcharge en utilisant des tailles de paquet plus importantes et UDP a un en-tête plus petit et pas de prise de contact.
  • Dépassement de la mémoire de la 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%.
  • Dépassement de méthode : Un programme bien conçu est décomposé en de nombreuses méthodes courtes. Mais chaque appel de méthode nécessite la configuration d’un cadre de stack, la copie des parameters 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 facilité de maintenance supplémentaire 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 couvert :

En informatique, les frais généraux sont généralement considérés comme une combinaison de temps de calcul excessif ou indirect, de mémoire, de bande passante ou d’autres ressources nécessaires pour atteindre un objective particulier. C’est un cas particulier d’ingénierie.

Vous êtes fatigué et ne pouvez plus faire de travail. Tu manges de la nourriture. L’énergie dépensée pour chercher de la nourriture, l’obtenir et la manger consum de l’énergie et est superflue!

Les frais généraux sont des choses gaspillées pour accomplir une tâche. Le but est de rendre les frais généraux très minimes.

En informatique, disons que vous voulez imprimer un numéro, c’est votre tâche. Mais en stockant le numéro, en configurant l’affichage pour l’imprimer et en appelant les routines pour l’imprimer, il est alors impossible d’accéder au numéro à partir de la variable.

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

Par exemple, l’insertion dans un arbre binary équilibré peut être beaucoup plus importante que la même insertion dans une simple liste chaînée (l’insertion prend plus de temps, utilise plus de puissance de traitement pour équilibrer l’arborescence, ce qui entraîne une durée d’opération plus longue de l’utilisateur).

Pour un programmeur, le terme «overhead» fait référence aux ressources système consommées par votre code lorsqu’il s’exécute sur une plate-forme générasortingce 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 d’implémentations possibles.

Par exemple, nous pourrions dire qu’une approche particulière peut entraîner une surcharge considérable du processeur, tandis qu’une autre peut entraîner une surcharge de mémoire et qu’une autre peut avoir une incidence sur 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. Lorsque le dernier numéro est rencontré (signalé par “fin de fichier” EOF, ou une valeur sentinelle, ou une partie de l’interface graphique, etc.), 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 sortingviale).

Une autre approche possible consiste à “slurp” l’entrée dans une liste. itérer sur la liste pour calculer la sum, puis diviser par le nombre d’éléments valides de la liste.

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

Dans une mauvaise implémentation particulière, nous pouvons effectuer l’opération de sum 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 stack (qui est un type de mémoire différent et qui 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, il suffit d’appeler la fonction SQL SUM sur cette colonne de cette table. Cela réduit notre surcharge de mémoire locale à un autre serveur et induit une surcharge du réseau et des dépendances externes sur notre exécution. (Notez que le serveur distant peut être associé ou non à une tâche particulière liée à la mémoire, par exemple).

Hypothétiquement, pourrait envisager une mise en œuvre sur une sorte de cluster (pour rendre possible la moyenne des billions de valeurs possibles). Dans ce cas, tout codage et toute dissortingbution nécessaires des valeurs (leur mappage vers les nœuds) et la collecte / collation des résultats (réduction) compteraient comme des frais généraux.

Nous pouvons également parler de la surcharge engendrée par des facteurs dépassant le propre code du programmeur. Par exemple, la compilation de certains codes pour des processeurs 32 ou 64 bits peut entraîner une surcharge supérieure à celle que l’on pourrait rencontrer 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 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é “overhead”, mais s’appelle plutôt “footprint”. La mémoire de base consommée par votre programme (indépendamment de tout dataset qu’il traite) est également appelée “empreinte”.

Vous pouvez utiliser un dictionnaire. La définition est la même. Mais pour vous faire gagner du temps, Overhead est 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.

Vous pouvez consulter Wikipedia . Mais surtout lorsque plus d’actions ou de ressources sont utilisées. Comme si vous connaissiez .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, que ce soit un appel local, en mémoire ou un appel réseau dissortingbué.

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 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 la même chose», les «frais généraux» impliqués sont très différents.

Pensez à la surcharge comme le temps requirejs pour gérer les threads et les coordonner. C’est un fardeau si le thread n’a pas assez de travail à faire. Dans un tel cas, les frais généraux entraînent un gain de temps grâce à l’utilisation du threading et le code prend plus de temps que le temps séquentiel.

son autre chose que les données elles-mêmes, c.-à-d. drapeaux TCP, en-têtes, crc, fcs, etc.