IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Efficacité des DLL


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 60
    Points : 41
    Points
    41
    Par défaut Efficacité des DLL
    Bonjour à tous,

    Développant une application assez lourde qui mélange à la fois de la gestion de fichier (lecture / écriture sur fichier txt) et beucoup de maths, je voudrais savoir si il y a un intérêt à "fragmenter le programme en DLL".
    Je sais - d'après un précédent message posté sur ce forum - que les DLL permettent une meilleure révision / mise à jour du code mais qu'elles sont "lentes" à utiliser... Est-ce que cela optimise la gestion de la mémoire lorsque le programme est exécuté ? Y a t'il plus de risque de plantage / viol. accès ? Bref quels en sont les avantages par rapport à un gros exe.

    Je vous remercie par avance pour votre réponse.

  2. #2
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Je vais peut-être dire une bêtise, mais je crois que l'intérêt principal est d'être partageable entre plusieurs programmes. Plusieurs .exe comme tu dis peuvent accéder à la même DLL au lieu de chacun copier en static dans l'exécutable.

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Une DLL permet effectivement de séparer de manière logique le code. Cela n'empêche pas un crash dans une DLL de remonter à l'appli qui utilise cette DLL. une DLL ne crashe jamais, c'est l'appli qui utilise cette DLL qui crash.

    Une DLL permet effectivement de partager du code entre plusieurs applications. Changer/modifier cette DLL suite à un bug corrige ce bug dans toutes les applis qui utilisent cette DLL. Pas besoin de relinker.

    Autre avantage, le code n'est pas dupliqué donc il y a économie de place sur le disque. Ceci est peut être un peu moins vrai de nos jours car le GOctet ne vaut plus rien mais il y a 20 ans (Ah!! souvenirs, souvenirs ), cela valait le coup.

    Inconvénient (ou désavantages) de la DLL, j'en voie au moins 2 :
    D'abors le temps de chargement du programme, il sera effectivement plus long mais cela est négligeable avec la puissance CPU dont on dispose maintenant donc cet inconvénient est vraiment très petit (voire même inexistant).

    Autre inconvénient, lors de la mise à jour de la DLL, il faut s'assurer qu'aucun programme ne l'utilise plus afin de pouvoir la remplacer (sinon, pas possible). Et cela est un problème pour les services qui font des mises à jour de code par Internet. Il faut bien gérer les dépendances et les locks.

    Donc en final les DLL oui sauf dans certains cas très précis et très rares.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 60
    Points : 41
    Points
    41
    Par défaut
    Merci pour vos réponses respectives. Par rapport à ce que disait ram_0000, si j'ai bien compris les paragraphes " :

    1- "Une DLL permet effectivement de partager du code entre plusieurs applications. Changer/modifier cette DLL suite à un bug corrige ce bug dans toutes les applis qui utilisent cette DLL. Pas besoin de relinker."

    2- "Autre avantage, le code n'est pas dupliqué donc il y a économie de place sur le disque. Ceci est peut être un peu moins vrai de nos jours car le GOctet ne vaut plus rien mais il y a 20 ans (Ah!! souvenirs, souvenirs ), cela valait le coup.
    "

    Si l'on réalise une fonction, utilisée dans plusieurs programmes, mais dont le code se trouve dans un fichier unique (par ex. fonction.h) cela est-il bien équivalent à l'avantage du §2 de la citation ?? Par contre, il est absolument nécessaire de recompiler le tout dans ce cas, donc on perd l'avantage du §1, est ce que je me trompe ??

    merci d'avance.

  5. #5
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 360
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 360
    Points : 20 377
    Points
    20 377
    Par défaut
    Citation Envoyé par ram_0000 Voir le message
    Inconvénient (ou désavantages) de la DLL, j'en voie au moins 2 :
    D'abors le temps de chargement du programme, il sera effectivement plus long
    le temps de chargement d'une dll n'est ni plus ni moins long ; c'est un programme exécutable au même titre qu'un .exe.
    Je ne sais pas qui a décrêté que les dll étaient longues à charger..
    Pour le projet de jeu que je fais je mets toutes les bitmaps dans une dll qui est chargée pour une partie donnée; la dll fait plus de 8Mo et le temps de chargement est très faible

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Points : 444
    Points
    444
    Par défaut
    Citation Envoyé par a_lincoln54 Voir le message
    Si l'on réalise une fonction, utilisée dans plusieurs programmes, mais dont le code se trouve dans un fichier unique (par ex. fonction.h) cela est-il bien équivalent à l'avantage du §2 de la citation ?? Par contre, il est absolument nécessaire de recompiler le tout dans ce cas, donc on perd l'avantage du §1, est ce que je me trompe ??

    merci d'avance.
    Le relink est nécessaire seulement dans le cas où tu modifies l'interface fournies aux clients (autrement dit les headers inclus par les programmes utilisant cette DLL). S'il s'agit juste d'une modification de l'implémentation (.cpp + .h non fournis au client), aucun besoin de relink.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    Pour le projet de jeu que je fais je mets toutes les bitmaps dans une dll qui est chargée pour une partie donnée; la dll fait plus de 8Mo et le temps de chargement est très faible
    Comme tous les monde, j'ai eu quelque cours sur le sujet (assez superficiels). Dans le cas dont je me souviens le mieux, il fallait procéder à un réadressage en modifiant toutes les instructions jump et certaines load/store au chargement d'une dll, ce qui la rendait toujours un peu plus longue qu'un exe à charger.
    Je ne sais plus si les systèmes d'exploitations fonctionnent effectivement comme ça mais je ne pense pas qu'il existe une autre façon de procéder qui soit vraiment parfaite et dénuée d'opérations lourdes comme celle ci.

    Dans ton cas ça ne compte pas, si tu n'as que des données binaires dans ta dll il n'y a effectivement rien à modifier, mais d'un autre coté tu pourrais aussi bien te passer de dll .

  8. #8
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    le temps de chargement d'une dll n'est ni plus ni moins long ; c'est un programme exécutable au même titre qu'un .exe.
    Je ne sais pas qui a décrêté que les dll étaient longues à charger..
    Pour le projet de jeu que je fais je mets toutes les bitmaps dans une dll qui est chargée pour une partie donnée; la dll fait plus de 8Mo et le temps de chargement est très faible
    Si si, j'insiste, le chargement d'une DLL de fonctions est nécessairement plus long car il faut que le loader gère la relocation des adresses des fonctions. Par contre, je suis bien d'accord, ce temps de chargement bien que plus long est insignifiant maintenant.

    Dans tons cas, cette DLL pourrait s'apparenter plus à une DLL de ressources qu'une DLL de code donc le temps de chargement n'a aucune influence dessus.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  9. #9
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    C'est pas tout à fait vrai... ni tout à fait faux....

    D'abord un interêt oublié dans les posts précédents: Le chargement dynamique de code. Pour des fonctions "on-demand" par exemple: un logiciel de dessin n'aurait que le minimum chargé en mémoire au démarrage... l'utilsation d'un outil irait charger une DLL additionel. Ou bien sur, les plug-ins.

    Le chargement d'un EXE (ou DLL c'est la même chose), se fait par simple memory mapping de la zone du disque... Si le disque est correctement défragmenté, le chargement se fait donc pratiquement à la vitesse nominale du disque (150Mbps pour un SATA donc... ca fait quand même 20Mops !). Et même mieux... le sharing est effectif pour la partie code entre plusieurs processus (le chargement de winnt.dll est donc pratiquement instantanné par exemple) !!!!


    La DLL contient une table de correspondances entre fonction "toto" (décorée) et l'addresse ou celle-ci se situe dans la DLL.
    C'est donc l'executable qui va devoir modifier ses jumps (et non la DLL) (en additionant au passage l'addresse de base de la DLL en mémoire).

    Bien évidemment, si on charge une DLL à la main (LoadLibrary), par exemple pour des plug-ins (ou des fonctions "on-demand"), cette étape n'a pas lieu.

    Bien entendu, l'executable ne va pas chercher tous les jumps dans son code pour "re-linker", mais fait une indirection vers une table de link. Ce qui veut dire que la quantité de travail a effectuer au chargement est proportionel au nombre de fonctions utilisées par l'exécutable (et non à la taille de la DLL).

    A noter pour finir que cette indirection induit un surcout sur les appels de fonctions non-virtuelles. Mais comme déjà évoqué maintes fois, ce surcôut est parfaitement négligeable.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment (si possible) gérer des dll en Asm?
    Par @drien dans le forum x86 32-bits / 64-bits
    Réponses: 5
    Dernier message: 06/01/2004, 15h59
  2. Priorité de recherche des DLLs
    Par patapetz dans le forum Windows
    Réponses: 3
    Dernier message: 10/09/2003, 18h44
  3. Appel à des fonctions incluses dans des DLL
    Par Greybird dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 13h33
  4. Réponses: 27
    Dernier message: 03/02/2003, 12h27
  5. [] [Install] Problème de mise à jour des dll
    Par pepper dans le forum Installation, Déploiement et Sécurité
    Réponses: 4
    Dernier message: 23/01/2003, 22h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo