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 :

perte de temps avec vector


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut perte de temps avec vector
    Bonsoir à tous !

    J'ai besoin d'aide, je suis en train de travailler sur un projet de matrices creuses de grandes tailles 200x200 notamment modifier une librairie existante pour l'optimisée. J'ai déjà effectué avec succès les opérations plus et inf pour des matrices représentées std::vector, mon problème est pour l'opération transpose, qui est très très lente par rapport à l'existant....

    voici le début de la classe matrixvector
    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
     
     
    struct Ttriplet
    {
     Ttriplet(int I, int J,serie S):i(I),j(J),s(S){}
    int i;
    int j;
    serie s;
            int geti(){return this->i;}
            int getj(){return this->j;}
            void seti(int k){i=k;}
            void setj(int k){this->j=k;}
            serie gets(){return this->s;}
            void sets(serie sa){this->s=sa;}
    } ;
     
    class matrixvector{
    private :
    		 int col,row;
    		 unsigned int size,capacity;
     
             std::vector<Ttriplet *> Data;
    ...
    et le code de la fonction transpose:
    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
     
    matrixvector transpose(matrixvector& a)
     {
        matrixvector result;
        //result.Data.reserve(a.size);
        Ttriplet *temp;
        int n=0,i=0,j=0;
        n=a.getsize();
        result.row=a.getcol();
        result.col=a.getrow();
         result.size=0;
        if(n>0)
        {
            result.size=1;
            for(i=0;i<a.col;++i)
            {
                for(j=0;j<n;++j)
                {
                  //  std::cout<<a.Data[j]->j<<std::endl;
                   if((a.Data.at(j)->j==i))
                        {
                            temp=new Ttriplet(a.getj(j),a.geti(j),a.Data[j]->s);
                            result.Data.push_back(temp);
                            result.size++;
                        }
    //
                }
     
            }
             return(result);
        }
     
          else
        {
            mem_limite  l(28);   throw(l);
        }
     
     }
    test:


    Merci !

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Si tu te soucies des performances, commence par utiliser [] plutôt que at().

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    il est dommage d'avoir supprimer une des plus grandes sources d'optimisation de l'utilisation du std::vector : vector::reserve.
    Ton vector se remplit à coup de push_back... ce qui entraîne désallocation et réallocation en chaîne.
    L'utilisation de at est également à proscrire.

    Après dans les plus petites optimisations possibles
    - préfère la préincrémentation à la postincrémentation
    - éviter d'utiliser des variables temporaires, même pour ne stocker qu'un vecteur, tu peux faire un push_back(new T)
    - pourquoi stocker result.size et l'incrémenter à chaque push_back ? vector possède sa fonction size (en temps constant) ... qu'il suffit d'appeler à la fin
    - passer la matrix resultat en paramètre out plutôt que par return, ça évite une copie

    qu'est-ce que serie ? pourquoi ne pas le retourner en const& ?
    pourquoi il n'est pas en const& dans le paramètre de sets ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    bonjour geoberto et bienvenue sur le forum

    La programmation de libs numérique est un domaine complexe et à la vue de ton code, j'ai l'impression que tu débutes, non ?
    Je te conseille de regarder les libs existantes et voir comment ce type de problématique est résolue, tu apprendras beaucoup comme ça
    Par exemple (mais non exclusif) :
    boost.uBlas http://www.boost.org/doc/libs/1_50_0.../doc/index.htm
    nt2 http://nt2.lri.fr/contents.html

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    bonjour geoberto et bienvenue sur le forum

    La programmation de libs numérique est un domaine complexe et à la vue de ton code, j'ai l'impression que tu débutes, non ?
    Je te conseille de regarder les libs existantes et voir comment ce type de problématique est résolue, tu apprendras beaucoup comme ça
    Par exemple (mais non exclusif) :
    boost.uBlas http://www.boost.org/doc/libs/1_50_0.../doc/index.htm
    nt2 http://nt2.lri.fr/contents.html
    Et ma préférée : Eigen http://eigen.tuxfamily.org/

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    Il y a une petite différence de performance entre l'opérateur [], un iterateur et un pointeur nu (double p = &t[0]. Certain diront non (que ça dépend entre autre des options de compilation)

    Ici, la différence entre vecteur et un tableau C-style est négligeable par rapport à tous les autres problèmes de conception, en particulier l'utilisation de push_back et l'absence de reserve. Il y a aussi le problème de new (faire 200*200 allocations ou presque, c'est pas top)

    Bref, comme d'hab -> profiling avant de chercher à faire de la micro-optimisation sur vector, un appel de fonction ou un déréférencement de pointeur
    Je réponds aux deux d'un coup. Sur Visual Studio, il me smeble que at() et [] font de la vérification. Pour at(), c'est obligatoire d'après la norme, mais pour [] ce n'est pas obligatoire de ne pas tester. Pour des raisons de sécurité, Microsoft a laissé le test.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Merci Bousk, mais c'est toujours aussi lent, la lenteur vient probablement du pushback...

    Le reserve ne change rien quel que soit la taille.

    Oui Guillaume je débute, j'ai déjà essayé avec un tableau de Ttriplet et j'ai passé une éternité à créer moi-même un pushback et à gérer les allocations dynamiques donc j'ai choisi d'utiliser les vector. Merci pour les libs je vais regarder ça.

    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
     
    void transpose(matrixCOOvector& a, matrixCOOvector &b)
     {
        //matrixCOOvector result;
        b.Data.reserve(a.size);
        Ttriplet *temp;
        int i=0,j=0;
        b.row=a.getcol();
        b.col=a.getrow();
        if(a.size>0)
        {
            for(i=0;i<a.col;++i)
            {
                for(j=0;j<a.size;++j)
                {
                  //  std::cout<<a.Data[j]->j<<std::endl;
                   if((a.Data[j]->j==i))
                        {
                         //  temp=new Ttriplet(a.getj(j),a.geti(j),a.Data[j]->s);
                            b.Data.push_back(new Ttriplet(a.getj(j),a.geti(j),a.Data[j]->s));
     
                        }
    //
                }
     
            }
                    b.size=b.Data.size();
        }
     
          else
        {
            mem_limite  l(28);   throw(l);
        }
     
     }

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Pourquoi utiliser des pointeurs et de l'allocation dynamique ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Pour ce genre de problèmes, n'utilise pas des vecteurs, mais du stockage à l'ancienne à base de pointeurs. En plus de gagner en efficacité, tu pourras plus facilement extraire des colonnes.

    Et quand tu peux, alloue la mémoire en une seule fois.

  10. #10
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Je vois pas pourquoi utiliser un vecteur avec les valeurs au lieu des pointeurs , réservé à la taille finale, serait moins bien que faire ce que tu viens de dire?

  11. #11
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Parce que tu économiserais en pointeurs, appels de fonctions et autres?

  12. #12
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    Citation Envoyé par oodini Voir le message
    Pour ce genre de problèmes, n'utilise pas des vecteurs, mais du stockage à l'ancienne à base de pointeurs. En plus de gagner en efficacité, tu pourras plus facilement extraire des colonnes.

    Et quand tu peux, alloue la mémoire en une seule fois.
    On lit ca et on l’exécute, puis on arrête de dire des bêtises sur std::vector

Discussions similaires

  1. Perte de performance avec un Filtrage en temps réel
    Par Takumi dans le forum Windows Presentation Foundation
    Réponses: 10
    Dernier message: 15/10/2010, 22h37
  2. Pertes de mémoire avec Rave
    Par stepschn dans le forum Delphi
    Réponses: 8
    Dernier message: 15/10/2006, 11h18
  3. pb avec vectors de pointeurs
    Par e-teo dans le forum SL & STL
    Réponses: 5
    Dernier message: 27/07/2005, 14h11
  4. Installation et perte d'icône avec Firebird
    Par SebCBien dans le forum Applications et environnements graphiques
    Réponses: 22
    Dernier message: 31/10/2004, 16h46
  5. probleme avec vector
    Par venomelektro dans le forum SL & STL
    Réponses: 16
    Dernier message: 16/08/2004, 23h39

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