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 :

Passer le std::vector en référence ou utiliser la move semantic de C++11


Sujet :

C++

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 38
    Points : 17
    Points
    17
    Par défaut Passer le std::vector en référence ou utiliser la move semantic de C++11
    Bonsoir à tous,

    Je voudrais optimiser le temps d'éxécution de mon code c++, je passe le std::vector en références voici un exemple

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    #include<iostream>
    using namespace std;
    #include<vector>void 
    Pivotage(vector<double> & arg,int l,int m, int ligne, int column)
    {
        int i,j;
        double pivot,coef,perm;
        i=l;
        while(arg[i*column+m]==0 && i<ligne)
        {
             i++;
         }
         if(i==ligne)
         {
              cerr <<"Pivot null et a pas lieu à une permutation" << endl;
              return;
         }
         else
         {
               /*permuter les deux ligne*/
               for(j=0;j<column;j++)
    	  {
                   perm=arg[l*column+j];
                   arg[l*column+j]=arg[i*column+j];
                   arg[i*column+j]=perm;
              }
        }
        pivot=arg[l*column+m];
     
        for(i=0;i<ligne;i++)
     
         if(i!=l)
         {
             coef=arg[i*column+m]/pivot;
             arg[i*column+m]=0;
             for(j=0;j<column;j++)
                 if(j!=m)
                 {
                      arg[i*column+j]=arg[i*column+j]-coef*arg[l*column+j];
                 }
        }
        coef=1/pivot;
        for(j=0;j<column;j++)
        arg[l*column+j]=coef*arg[l*column+j];
        //cout<<"pivotage"<<endl;
    }
    vector<double> Inverse(vector<double>const & arg,int ligne)
    {
        int i,j,column=ligne*2;
        vector<double> arg1(ligne*column);
        //arg1.resize(ligne*column);
        //double *arg1 = new double[ligne * column];
        //double *inver=new double[ligne*ligne];
        vector<double> inver(ligne*ligne);
        //inver.resize(ligne*ligne);
        //cout<<"le pb n'est pas dans l'inverse"<<endl;
        for(i=0;i<ligne;i++)
            for(j=0;j<ligne;j++)
                arg1[i*column+j]=arg[i*ligne+j];
         for(i=0;i<ligne;i++)
            for(j=0;j<ligne;j++)
                 arg1[i*column+(j+ligne)]=0;
         for(i=0;i<ligne;i++)
             arg1[i*column+(i+ligne)]=1;
        //cout<<"lign"<<ligne<<endl;
        for(i=0;i<ligne;i++)
        {
            Pivotage(arg1,i,i,ligne,column);
        }
        for(i=0;i<ligne;i++)
            for(j=0;j<ligne;j++)
                inver[i*ligne+j]=arg1[i*column+(j+ligne)];
        // delete[] arg1;
        // cout<<"inverse"<<endl;
        return(inver);	
    }
    void main()
    {
        vector<double> A(n*n),B(n*n);
        int n;
        B=Inverse(A,n);
    }
    Mais mon code en entier est trop lord est ce que il faut utiliser la move sémantique de C++11 ici? si oui comment ?

    Et merci d'avance pour vos réponses

  2. #2
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Le compilateur devrait déjà avoir fait un "Return Value Optimization" pour toi (sinon tu dois pouvoir utiliser std::move).
    Tu actives bien les options d'optimisations du compilateur ?
    Tu as mesuré le temps mis par la fonction Inverse ? et le temps mis à l'intérieur de la fonction Inverse ?

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 38
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par Ehonn Voir le message
    Le compilateur devrait déjà avoir fait un "Return Value Optimization" pour toi (sinon tu dois pouvoir utiliser std::move).
    Tu actives bien les options d'optimisations du compilateur ?
    Tu as mesuré le temps mis par la fonction Inverse ? et le temps mis à l'intérieur de la fonction Inverse ?
    Oui j'ai activé les optimisation du compilateur du visual studio 2010, pour le temps d'exécution le programme en entier ne contient pas que cette fonction mais je commence à compter le temps d'exécution juste après le main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void main()
    {
    StartCounter();
    .............
    temps=GetCounter();
    cout<<"Temps d'execution "<<temps<<" millisecondes"<<endl;
    }

  4. #4
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Et donc tu as mesuré les deux temps que j'ai indiqué pour connaître le coût du retour du vecteur (+ appel de fonction) ?

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 38
    Points : 17
    Points
    17
    Par défaut
    Oui j'ai eu le meme temps peut etre parceque l'exemple est simple

  6. #6
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    @Ehonn: C'est déjà le move ctor qui est appelé dans ce cas, le move est inutile. L’élision peut aussi avoir lieux, dans ce cas elle permet d’élider le move ctor.

    @OP: A priori je ne vois rien comme ça, si ce n'est essayer de stocker dans l'autre "sens", l'un des deux sens peut potentiellement faire une meilleur utilisation du cache. Par contre si tu présentais mieux ton code, on y verrais plus clair, parce que là l'indentation laisse à désirer (j'arrive pas à voir de logique sur tes décisions de faire des retraits de ligne).

    As tu aussi travailler ton algorithme ? Il est peut-être lent, car lent par nature.

  7. #7
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 38
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    @OP: A priori je ne vois rien comme ça, si ce n'est essayer de stocker dans l'autre "sens", l'un des deux sens peut potentiellement faire une meilleur utilisation du cache. Par contre si tu présentais mieux ton code, on y verrais plus clair, parce que là l'indentation laisse à désirer (j'arrive pas à voir de logique sur tes décisions de faire des retraits de ligne).
    Merci pour votre répose mais sincèrement j'arrive pas à comprendre ce que vous voulez dire exactement
    Citation Envoyé par Flob90 Voir le message
    As tu aussi travailler ton algorithme ? Il est peut-être lent, car lent par nature.
    Oui théoriquement l'algorithme que je vient d'implémenter est la meilleur façon de faire (il ya pas mieux pour l'instant)

Discussions similaires

  1. std::vector semble ne pas utiliser std::move, pourquoi ?
    Par n0-sheep dans le forum SL & STL
    Réponses: 7
    Dernier message: 15/03/2014, 01h25
  2. std::vector et références
    Par fma38 dans le forum Langage
    Réponses: 29
    Dernier message: 11/12/2013, 13h59
  3. Retourner une référence sur un std::vector
    Par Rodrigue dans le forum C++
    Réponses: 12
    Dernier message: 13/10/2007, 16h30
  4. 3 précisions sur l'utilisation des "std::vector"
    Par Invité dans le forum SL & STL
    Réponses: 9
    Dernier message: 10/01/2006, 00h42
  5. Réponses: 8
    Dernier message: 26/08/2004, 18h59

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