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

Visual C++ Discussion :

Problème de rapidité d'exécution VC++6.0/VS2008


Sujet :

Visual C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de Thrud
    Profil pro
    Développeur .NET
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Par défaut Problème de rapidité d'exécution VC++6.0/VS2008
    Bonjour,

    j'ai des problèmes de performance sur une application. Elle avait été développée sous VC++6.0, et elle a été portée sous VS2008.
    Après quelques tests, j'arrive à la conclusion que le code produit par VS2008 est bien plus lent que celui produit par VC++6.0 !
    Le problème concerne des actions sur une std::map.
    J'ai refait un petit programme d'exmple pour bien isoler le problème.

    J'ai une classe qui contient un membre de type std::map<>, dans lequel j'insère des attributs. Je commence par faire une recherche pour vérifier si l'attribut existe, j'alloue le nouvel attribut, et je l'insère dans la map.
    La classe Attribute ne fait rien, et le programme principal se contente d'instancier un BusinessObj, et d'appeler la methode FillAttributes().

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
     
    void BusinessObj::FillAttributes()
    {
        AddAttribute( "Attribute1" );
        AddAttribute( "Attribute2" );
        AddAttribute( "Attribute3" );
        AddAttribute( "Attribute4" );
        AddAttribute( "Attribute5" );
    }
     
    void BusinessObj::AddAttribute( char* Attrib_name )
    {
        map < char * , Attribute *,ltstr1>::iterator itor; 
        LARGE_INTEGER liStart;
        LARGE_INTEGER liFrequency;
        LARGE_INTEGER liFind;
        LARGE_INTEGER liAlloc;
        LARGE_INTEGER liInsert;
     
        ::QueryPerformanceFrequency( &liFrequency );
        ::QueryPerformanceCounter( &liStart );
     
        itor = Attributes.find((char *) Attrib_name); 
        ::QueryPerformanceCounter( &liFind );
     
        if (itor==Attributes.end())
        {
     
            Attribute* pNewAttribute = new Attribute(); 
            ::QueryPerformanceCounter( &liAlloc );
            Attributes[(char *) strdup(Attrib_name)] = pNewAttribute;
            ::QueryPerformanceCounter( &liInsert );
        }
     
        char chBuffer[400];
        sprintf(chBuffer, "CBusinessObj::InsertAttribute : Find : %f s -- Alloc : %f s -- Insert : %f s \n", 
            (liFind.QuadPart - liStart.QuadPart) * 1.0 / liFrequency.QuadPart,
            (liAlloc.QuadPart - liFind.QuadPart) * 1.0 / liFrequency.QuadPart,
            (liInsert.QuadPart - liAlloc.QuadPart) * 1.0 / liFrequency.QuadPart
            );
        ::OutputDebugString( chBuffer );
    }
    sous VC++6.0, ça me donne les temps suivants.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CBusinessObj::InsertAttribute : Find : 0.000002 s -- Alloc : 0.000003 s -- Insert : 0.000016 s 
    CBusinessObj::InsertAttribute : Find : 0.000001 s -- Alloc : 0.000003 s -- Insert : 0.000005 s 
    CBusinessObj::InsertAttribute : Find : 0.000001 s -- Alloc : 0.000002 s -- Insert : 0.000005 s 
    CBusinessObj::InsertAttribute : Find : 0.000001 s -- Alloc : 0.000002 s -- Insert : 0.000004 s 
    CBusinessObj::InsertAttribute : Find : 0.000002 s -- Alloc : 0.000004 s -- Insert : 0.000009 s

    et le même projet porté sous VS2008 me donne les temps suivants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CBusinessObj::InsertAttribute : Find : 0.000011 s -- Alloc : 0.000005 s -- Insert : 0.000014 s 
    CBusinessObj::InsertAttribute : Find : 0.000009 s -- Alloc : 0.000008 s -- Insert : 0.000018 s 
    CBusinessObj::InsertAttribute : Find : 0.000008 s -- Alloc : 0.000007 s -- Insert : 0.000019 s 
    CBusinessObj::InsertAttribute : Find : 0.000009 s -- Alloc : 0.000006 s -- Insert : 0.000018 s 
    CBusinessObj::InsertAttribute : Find : 0.000009 s -- Alloc : 0.000006 s -- Insert : 0.000019 s
    la question est : mais pourquoi ??
    Comment expliquer le facteur 5 pour le find, et le facteur 3 pour l'insert dans la map ??
    Comment retrouver des valeurs identiques à celles de VC++6.0 avec VS2008 ?

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Essaie en activant le "Link time code generation" (onglet Édition de liens, rubrique Optimisations) pour voir si ça corrige ou pas ton problème...

    Vérifie également que tu as bien un projet VS2008 "propre", qui n'hérites pas de la feuille de style "Compatibilité VC6" (onglet Général) : les projets importés depuis les DSP/DSW VC6 sont, au mieux, moyens.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Si c'est possible (et souhaitable) il faut aussi désactiver _SECURE_SCL (et _HAS_ITERATOR_DEBUGGING ?) car ce sont des ajouts de MS ajoutant des contrôles qui peuvent consommer du temps.

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    vérifie aussi les options d'optimisation dans l'onglet C++ (/O2 /Ox )
    et l'option /ot : privilégier la vitesse à la taille.
    et je confirme il y a bug sur la conversion de projet vc6 en vc2008 qui peut donner des résultats catastrophiques en terme de perfs...

    farscape en direct des techdays sur le stand de dvp !

  5. #5
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par farscape Voir le message
    et je confirme il y a bug sur la conversion de projet vc6 en vc2008 qui peut donner des résultats catastrophiques en terme de perfs...
    Ah, t'as remarqué toi aussi, hein...

    Pour ma part, j'ai refais des projets "propres" VS2008, en ayant simultanément VS2008 et VC6 ouverts simultanément. Je m'en suis servi à 99% pour copier/coller les chemins d'inclusion et les listes de librairies uniquement.

    C'est plus long, mais c'est moins long que de nettoyer le projet converti, je trouve, et surtout c'est nettement plus fiable.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

Discussions similaires

  1. [Hibernate][Oracle] Problème de rapidité
    Par Saloucious dans le forum Hibernate
    Réponses: 7
    Dernier message: 27/11/2008, 11h00
  2. Problème de rapidité d'exécution ou compilation
    Par HASSIOMAR dans le forum Langage
    Réponses: 2
    Dernier message: 17/07/2008, 13h13
  3. Réponses: 4
    Dernier message: 13/04/2006, 08h57
  4. [Système] rapidité d'exécution if <> switch
    Par lalouve dans le forum Langage
    Réponses: 12
    Dernier message: 10/02/2006, 22h52
  5. Problème lors de l'exécution de mes programmes
    Par darkmalak01 dans le forum Langage
    Réponses: 7
    Dernier message: 27/09/2005, 18h35

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