49 votes

L'utilisation de bibliothèques volumineuses crée-t-elle un code plus lent?

J'ai psychologique tic qui me fait hésiter à utiliser de grandes bibliothèques (comme GLib ou Boost) dans le bas-niveau des langages tels que C et C++. Dans mon esprit, je pense que:

Eh bien, cette bibliothèque a des milliers de l'homme heures mis en elle, et elle a été créé par des gens qui en savent beaucoup plus à propos de la langue que je ne le sera jamais. Leurs auteurs et les fans disent que les bibliothèques sont rapides et fiables, et la fonctionnalité ressemble vraiment utile, et il ne sera certainement m'arrêter à partir de la (mal) réinventer la roue.

Mais putain, je ne vais jamais utiliser chaque fonction dans la bibliothèque. C'est trop grand et c'est probablement devenir énorme au fil des ans; c'est une autre balle et la chaîne de mon programme doit traîner.

Le Torvalds coup de gueule (controversé s'il en est) n'a pas exactement de mettre mon cœur à l'aise non plus.

Est-il un fondement de ma pensée, ou suis-je simplement déraisonnable et/ou ignorants? Même si je n'utilise qu'un ou deux dispose d'une grande bibliothèque, en les reliant à la bibliothèque vais-je subir les performances d'exécution de frais généraux?

Je suis sûr que cela dépend aussi de ce que la bibliothèque l'est, mais je suis généralement intéressés à savoir si les grandes bibliothèques, au niveau technique, intrinsèquement introduire des inefficacités.

Je suis fatigué d'être obsédée et de murmurer et de se préoccuper de cela, quand je n'ai pas les connaissances techniques pour savoir si j'ai raison ou pas.

S'il vous plaît mettez-moi à sortir de ma misère!

33voto

greyfade Points 14358

Même si je n'utilise qu'un ou deux dispose d'une grande bibliothèque, en les reliant à la bibliothèque vais-je subir les performances d'exécution de frais généraux?

En général, non.

Si la bibliothèque en question n'a pas beaucoup de code indépendant de la position, puis il y aura un coût de démarrage, tandis que l'éditeur de liens dynamique effectue des déménagements sur la bibliothèque, quand il est demandé. Habituellement, qui fait partie du programme de la start-up. Il n'y a aucun moment de l'exécution de leur impact sur les performances au-delà.

Les Linkers sont aussi bon à enlever "code mort" de manière statique des bibliothèques liées au moment de la construction, de sorte que toute les bibliothèques statiques que vous utilisez ont un minimum de taille de frais généraux. La Performance n'a même pas entrer en elle.

Franchement, vous êtes vous soucier de mauvaises choses.

26voto

Timo Geusch Points 16952

Je ne peux pas commenter sur GLib, mais gardez à l'esprit que beaucoup de code Boost est d'en-tête uniquement, et vu le C++ principe de l'utilisateur de ne payer que pour ce qu'ils utilisent, les bibliothèques sont assez efficaces. Il existe plusieurs bibliothèques qui nécessitent de vous relier à leur encontre (regex, système de fichiers, etc viennent à l'esprit), mais ils sont distincts des bibliothèques. Avec le coup de pouce que vous n'avez pas de lien contre un grand monolithique de la bibliothèque, mais seulement contre les éléments plus petits que vous utilisez.

Bien sûr, l'autre question est - ce que c'est l'alternative? Voulez-vous mettre en œuvre la fonctionnalité qui est en Boost-vous quand vous en avez besoin? Étant donné que beaucoup de personnes très compétentes ont travaillé sur ce code et vérifié qu'il fonctionne sur une multitude de compilateurs et est toujours efficace, cela peut ne pas être exactement un simple engagement. De Plus, vous êtes en train de réinventer la roue, au moins dans une certaine mesure. À mon humble avis, vous pouvez passer ce temps de manière plus productive.

13voto

jalf Points 142628

Boost n'est pas d'une grande bibliothèque.

C'est une collection de beaucoup de petites bibliothèques. La plupart d'entre eux sont si petits qu'ils sont contenus dans un en-tête ou deux. À l'aide de boost::noncopyable ne pas glisser boost::regex ou boost::thread dans votre code. Ils sont différents des bibliothèques. Ils sont distribués dans le cadre de la même collection de la bibliothèque. Mais vous ne payez que pour ceux que vous utilisez.

Mais en parlant de façon générale, parce que les grandes bibliothèques existent, même si le Boost n'est pas l'un d'eux:

Est-il un fondement de ma pensée, ou suis-je simplement déraisonnable et/ou ignorants? Même si je n'utilise qu'un ou deux dispose d'une grande bibliothèque, en les reliant à la bibliothèque vais-je subir les performances d'exécution de frais généraux?

Pas de base, plus ou moins. Vous pouvez tester vous-même.

Écrire un petit programme en C++ et le compiler. Maintenant, ajoutez une nouvelle fonction, celle qui n'est jamais appelé, mais il est défini. Compiler le programme à nouveau. En supposant que les optimisations sont activées, il obtient supprimés par l'éditeur de liens, car il est inutilisé. De sorte que le coût d'inclure d'autres inutilisés code est égal à zéro.

Bien sûr il y a des exceptions. Si le code instancie un quelconque des objets globaux, ceux-ci peuvent ne pas être supprimés (donc y compris l' iostream - tête augmente la taille de l'exécutable), mais en général, vous pouvez inclure autant d'en-têtes et lien à autant de bibliothèques que vous le souhaitez, et il n'affecte pas la taille, des performances ou de l'utilisation de la mémoire de votre programme *tant que vous n'avez pas à utiliser l'un de l'ajout d'un code.

Une autre exception est que si vous avez un lien dynamique vers un .dll ou .ainsi, l'ensemble de la bibliothèque doit être distribué, et donc il ne peut pas être dépouillé de code inutilisé. Mais les bibliothèques qui sont compilés statiquement dans votre exécutable (comme les bibliothèques statiques (.lib ou .a) ou tout aussi inclus les fichiers d'en-tête peut généralement être réduite par l'éditeur de liens, en supprimant les symboles inutilisés.

11voto

Pavel Shved Points 34706

Grande bibliothèque, à partir du code point de vue des performances:

  • occupent plus de mémoire, si elle a un temps d'exécution binaire (la plupart des régions de l' boost ne nécessitent pas l'exécution de fichiers binaires, ils sont "en-tête uniquement"). Tandis que l'OS se charge uniquement le fait des pièces de la bibliothèque de RAM, il peut encore charger plus que vous avez besoin, parce que la granularité de ce qui est chargé est égale à la taille de la page (4 Ko uniquement sur mon système, tout de même).
  • prendre plus de temps à charger par l'éditeur de liens dynamiques, si, encore une fois, il a besoin d'exécution de fichiers binaires. Chaque fois que votre programme est chargé, l'éditeur de liens dynamiques a pour correspondre à chaque fonction, vous avez besoin d'une bibliothèque externe pour contenir à son adresse réelle dans la mémoire. Il faut un certain temps, mais juste un peu (cependant, il importe à l'échelle de chargement de nombreux programmes, tels que le démarrage de l'environnement de bureau, mais vous n'avez pas de choix là-bas).

    Et oui, il faudra un supplément de saut et un couple de pointeur ajustements au moment de l'exécution à chaque appel de fonction externe d'un partagées (liée dynamiquement) bibliothèque

à partir d'un développeur du point de vue des performances:

  • ajouter une dépendance externe. Vous serez en fonction de quelqu'un d'autre. Même si la bibliothèque est un logiciel libre, vous aurez besoin de frais supplémentaires pour le modifier. Certains développeurs de veeery de bas niveau (je parle d'OS de grains) hate de compter sur personne,--c'est leur professionnel de la perk. Ainsi, les coups de gueule.

    Cependant, qui peut être considéré comme un avantage. Si d'autres personnes ont pris l'habitude de l' boost, ils vont trouver des concepts et des termes de votre programme et sera plus efficace de la compréhension et de la modifier.

  • Plus les bibliothèques contiennent de la bibliothèque des concepts spécifiques qui prennent le temps de comprendre. Envisager De Qt. Il contient des signaux et des slots et moc-de l'infrastructure connexe. Par rapport à la taille de l'ensemble de l'intervalle Qt, leur apprentissage prend une petite fraction de temps. Mais si vous utilisez une petite partie d'une grande bibliothèque, qui peut être un problème.

5voto

Anon. Points 26829

L'excès de code ne ralentit pas, comme par magie, le processeur. Tout ce qu’il fait, c’est occuper un peu de mémoire.

Si vous liez statiquement et que votre éditeur de lien est raisonnable, il n'inclura que les fonctions que vous utilisez de toute façon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X