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

Windows Discussion :

Rapidité des DLL


Sujet :

Windows

  1. #1
    Membre éclairé Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Par défaut Rapidité des DLL
    Salut,
    Je viens de faire un test de rapidité sur les DLL très surprennent ( en C++ )
    Voici la fonction contenue dans ma DLL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    extern "C" __declspec(dllexport) void testDLL()
    {
        for &#40;int i = 0; i<1000000 ; i++&#41;
        for &#40;int y = 0; y < 2000 ; y++&#41;;
        printf&#40;"fin\n"&#41;;
    &#125;

    J’inclus ensuite cette fonction et mesure le temps d’exécution comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    extern "C" __declspec &#40;dllimport&#41; void testDLL &#40;&#41;;
    
    int main&#40;&#41;
    &#123;
        DWORD a = GetTickCount&#40;&#41;;
        testDLL&#40;&#41;;
        printf&#40;"temps = %d\n",GetTickCount&#40;&#41;-a&#41;;
        system&#40;"PAUSE"&#41;;
    &#125;
    J’obtiens un temps de 5100 ms.

    Je fait ensuite le même programme sans utiliser de DLL comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    void testsansDLL&#40;&#41;
    &#123;
        for &#40;int i = 0; i<1000000 ; i++&#41;
        for &#40;int y = 0; y < 2000 ; y++&#41;;
        printf&#40;"fin\n"&#41;;
    &#125;
    
    int main&#40;int argc, char *argv&#91;&#93;&#41;
    &#123;
        DWORD a = GetTickCount&#40;&#41;;
        testsansDLL&#40;&#41;;
        
        printf&#40;"temps = %d\n",GetTickCount&#40;&#41;-a&#41;;
        
        
        system&#40;"PAUSE"&#41;;
        return EXIT_SUCCESS;
    &#125;
    cette foi si j’obtiens un temps de 2000 ms.


    Avec ce petit teste très simple, je trouve que l’exécution d’une fonction par DLL est plus de 2 foie plus lente que l’appelle d’une fonction directement dans le programme.
    Je trouve ce chiffre extrêmement gros surtout que la plus par des logicielle dont la rapidité est primordial utilise des DLL comme les moteur 3d par exemple...

    Cela est t’il normal ou mon teste est foireux ?

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2002
    Messages
    3 338
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 338
    Par défaut
    Juste pour tester un truc, reboot ton OS entre les 2 tests :-)

  3. #3
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Refait déjà le test en enlevant le printf du chronométrage. Au niveau de l'optimisation du compilo ça peut beaucoup jouer aussi car il peut inliner ta fonction, voire la supprimer et se contenter du printf...
    Faut comparer le code assembleur en somme.

  4. #4
    Membre éclairé Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Par défaut
    Gaël Donat> non, le reboot entre les 2 tests ne change rien :^/

    Aurelien.Regat-Barrel> ha tu croi que ca vien d'une optimisation du compilateur ? mais dans se cas la, il aurais pas mis plus de 2 seconde pour affichier just un printf ...

  5. #5
    Membre éclairé
    Inscrit en
    Septembre 2002
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 230
    Par défaut
    Personellement je ne comprends pas comment VC++ fait pour être si gourmant en temps de calcul.
    J'avais un code C que je compilais sous Linux avec une ancienne machine qui a un temps de calcul beaucoup moins important que le même code que j'ai porté sous VC++ et qui est en plus exécuté sur une nouvelle machine beaucoup plus puissante !!!
    J'ai déjà posé une question dans ce sens sur le forum et la réponse était de compiler en mode RELEASE chose que je fais déjà.
    Je reste sans réponse !
    J'ai lu souvent que le vrai problème des systèmes Microsoft est la gestion de la mémoire !!! Je commence à croire à ça alors que jusqu'au là je le disais qu e ce sont les pro Linuxiens qui s'acharnent sur Microsoft sans raisons fondées !
    Que pensez vous de ce que je viens de dire??? (Je ne suis ni pro microsoft ni pro linux, je veux comprendre c'est tout)

    Merci

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    SOus linux, tu spécifiais une architecture pour l'optimisation? Sous Visual, on peut le faire aussi, alors que par défaut, il pond quelque chose qui tourne lentement, mais qui tourne partout...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre éclairé
    Inscrit en
    Septembre 2002
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 230
    Par défaut
    Médinoc, comment faire pour spécifier l'architecture sous VC++ pour que ça tourne vite.
    Il faut que ça tourne le plus rapidement possible sur ma machine, je n'ai nullement besoin de la portabilité de mon programme sur d'autres machines.
    Config de la machine : PIV 2.8 GHZ

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Visual 6 : Project Settings -> Onglet "C/C++" -> "Code generation" -> "Processor"

    Visual 2005 : J'ai seulement trouvé Project properties -> "C/C++" -> Code Generation -> "Enable enhanced instruction set"

    Mais il y a aussi des trucs à régler dans les optimisations, des options qui semblent ne pas être activées par défaut en mode release : Regarde à Project properties -> "C/C++" -> Optimization

    Regarde aussi la CallingConvention dans "advanced" (tu peux mettre en __fastcall)

    Tu as aussi Project properties -> Linker -> Advanced -> Target Machine
    Project properties -> Linker ->Optimization
    Project properties -> Configuration Properties -> Whole program optimization
    et j'en passe...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Ekinoks
    Aurelien.Regat-Barrel> ha tu croi que ca vien d'une optimisation du compilateur ? mais dans se cas la, il aurais pas mis plus de 2 seconde pour affichier just un printf ...
    Quoi qu'il en soit prendre en compte l'affichage du printf dans le chrnométrage est pas une bonne idée. Ensuite, si l'optimisation est activée, c'est étonnant qu'il n'ait pas viré tes 2 boucles.

    Citation Envoyé par Axiome
    Personellement je ne comprends pas comment VC++ fait pour être si gourmant en temps de calcul.
    J'avais un code C que je compilais sous Linux avec une ancienne machine qui a un temps de calcul beaucoup moins important que le même code que j'ai porté sous VC++ et qui est en plus exécuté sur une nouvelle machine beaucoup plus puissante !!!
    J'ai déjà posé une question dans ce sens sur le forum et la réponse était de compiler en mode RELEASE chose que je fais déjà.
    Je reste sans réponse !
    J'ai lu souvent que le vrai problème des systèmes Microsoft est la gestion de la mémoire !!! Je commence à croire à ça alors que jusqu'au là je le disais qu e ce sont les pro Linuxiens qui s'acharnent sur Microsoft sans raisons fondées !
    Que pensez vous de ce que je viens de dire??? (Je ne suis ni pro microsoft ni pro linux, je veux comprendre c'est tout)
    Merci
    VC++ a pourtant la réputation de produire un code mieux optimisé que gcc (sous Windows), et d'être l'un des compilos les plus performants dans ce domaine. La gestion mémoire n'a rien à voir à ce niveau. Après dire qu'elle est moins performante sous Windows ça n'engage que les Linuxiens. Dans ce domaine chacun trouvera un test qui prouve que l'un est meilleur que l'autre. Dans le pratique, pour la plupart des applis, ça ne change rien.
    Si ton algo est lent, je ne suis pas sûr que ce soit de la faute à MS

  10. #10
    Membre éclairé
    Inscrit en
    Septembre 2002
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 230
    Par défaut
    pour Aurelien.Regat-Barrel,
    justement je ne veux pas polimiquer sur ce point. mais le pb c'est que je n'arrive pas à optimiser mon exécutable généré par VC++ 6.
    As tu des astuces ou des conseils pour bien paramétrer les options d'exécution.
    J'ai voulu mettre sous code generation en multi thread mais ça ne compile pas. j'ai des messages d'erreurs !!
    prticulièrement en mode __fastcall
    est ce normal?

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Régler codegeneration en multithread ne sert à rien si ton programme lui-même n'est pas en multithread.
    D'ailleurs, utiliser la librairie CRT multithread dans une application monothreadée ralentira le programme (puisqu'il y a des ops de synchronisation en plus)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    J'ai vu ta question sur le forum VC++. Faut identifier précisément où est perdu le temps avant de chercher des solutions.

  13. #13
    Membre éclairé
    Inscrit en
    Septembre 2002
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 230
    Par défaut
    merci Médinoc pour l'info sur les multithreads.
    Quant à Aurelien.Regat-Barrel, normalement il y a pas vraiment de perte de temps sur mon algo puisqu'il est exécuté en 800 ms mais je cherche à le rendre plus performant. Une fois, j'ai joué sur des paramètres de compilation et ce même code a été exécuté en 400 ms mais voilà je ne sais plus vraiment qu'est ce que j'ai choisis comme option de compilation

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