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 averti
    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
    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 Expert Avatar de Ehonn
    Homme Profil pro
    �tudiant
    Inscrit en
    F�vrier 2012
    Messages
    788
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France

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

    Informations forums :
    Inscription : F�vrier 2012
    Messages : 788
    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 averti
    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
    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 Expert Avatar de Ehonn
    Homme Profil pro
    �tudiant
    Inscrit en
    F�vrier 2012
    Messages
    788
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France

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

    Informations forums :
    Inscription : F�vrier 2012
    Messages : 788
    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 averti
    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
    Par d�faut
    Oui j'ai eu le meme temps peut etre parceque l'exemple est simple

  6. #6
    Membre Expert

    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 : 35
    Localisation : France, Doubs (Franche Comt�)

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

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 1 391
    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 averti
    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
    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