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

SL & STL C++ Discussion :

accélérer les algorithm


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut accélérer les algorithm
    Bonjour,
    constatant que les algo utilise souvent la fonction swap. J'ai essayer de jouer avec pour optimiser un sort.
    Voici le code :
    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
     
    #include <algorithm>
    #include <iostream>
    #include <vector>
    #include <string>
     
    //class qui contient la fonction swap pour éviter des recopie de memoire
    class A 
    {
    public :
    	A(int a,std::string s) :myString(s),nb(a){ };
     
    	const std::string &GetString() {return myString;}
    	bool operator<(const A& a) {return nb<a.nb;}
    	A&  operator=(const A& a) 
    		{
    		static int nbegale(0);
    		std::cout<<"= : "<<++nbegale<<std::endl;
    		nb<a.nb;
    		myString=a.myString;
    		return (*this);
    		}
    	void swap(A& a) 
    		{
    			static int nbswap(0);
    			std::cout<<"swap : "<<++nbswap<<std::endl;
    			std::swap(nb,a.nb);
    			myString.swap(a.myString);
    		};
    private:
    	std::string myString;
    	int nb;
     
    };
    //specialisation de la fonction swap pour la class A
    template<>
    inline void std::swap<A> ( A& a, A& b )
    {
    	a.swap(b);
    };
     
    int main(int argc, char** argv)
    {
    	//mon vecteur a trier
    	std::vector<A> vect;
           //on remplie de n'importe quoi
          //le but etant quil y en ai assez pour que swap soit appelé
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(30,"trente"));
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(30,"trente"));
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(30,"trente"));
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(30,"trente"));
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(30,"trente"));
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(30,"trente"));
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(30,"trente"));
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(30,"trente"));
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(30,"trente"));
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(30,"trente"));
    	vect.push_back(A(30,"trente"));
    	vect.push_back(A(30,"trente"));
    	vect.push_back(A(30,"trente"));
    	vect.push_back(A(30,"trente"));
    	vect.push_back(A(30,"trente"));
     
         //on fait le trie
    	std::sort(vect.begin(),vect.end());
    return 0;
    }
    En prenant l'hypothèse qu'un égale dure 1 second (du au reallocation et recopie de memoire), et swap .5s (echange de la mémoire, donc peut de recopie)

    Les résultats que j'obtiens sous visual 20005 sont :
    - sans le swap : 234 operation egale = 234s
    - avec le swap : 74 operation swap et 72 operation egale = 109 s

    Ce qui n'est pas négligable.
    Maintenant je me demandé si :
    1- ce que j'ai fait est tout à fait correcte
    2- il n'y as pas d'autre manière de faire
    3- on est obligé de spécifier std::swap

    [EDIT]
    4- existe t'il d'autre astuce comme celle la???
    merci

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    voici une rversion qui marche avec GCC
    Code C++ : 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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
     
    #include <algorithm>
    #include <iostream>
    #include <vector>
    #include <string>
     
    //class qui contient la fonction swap pour éviter des recopie de memoire
    class A
    {
    public :
    	A(int a,std::string s) :myString(s),nb(a){ };
     
    	const std::string &GetString() {return myString;}
    	bool operator<(const A& a)const {return nb<a.nb;}
    	A&  operator=(const A& a)
    		{
    		static int nbegale(0);
    		std::cout<<"= : "<<++nbegale<<std::endl;
    		nb=a.nb;
    		myString=a.myString;
    		return (*this);
    		}
    	void swap(A& a)
    		{
    			static int nbswap(0);
    			std::cout<<"swap : "<<++nbswap<<std::endl;
    			std::swap(nb,a.nb);
    			myString.swap(a.myString);
    		};
    private:
    	std::string myString;
    	int nb;
     
    };
    //specialisation de la fonction swap pour la class A
    namespace std
    {
    template<>
    inline void swap<A> ( A& a, A& b )
    {
    	a.swap(b);
    };
    }
     
    int main(int argc, char** argv)
    {
    	//mon vecteur a trier
    	std::vector<A> vect;
           //on remplie de n'importe quoi
          //le but etant quil y en ai assez pour que swap soit appelé
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(30,"trente"));
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(30,"trente"));
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(30,"trente"));
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(30,"trente"));
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(30,"trente"));
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(30,"trente"));
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(30,"trente"));
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(30,"trente"));
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(30,"trente"));
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(2,"deux"));
    	vect.push_back(A(15,"quinze"));
    	vect.push_back(A(10,"dix"));
    	vect.push_back(A(5,"cinq"));
    	vect.push_back(A(1,"un"));
    	vect.push_back(A(30,"trente"));
    	vect.push_back(A(30,"trente"));
    	vect.push_back(A(30,"trente"));
    	vect.push_back(A(30,"trente"));
    	vect.push_back(A(30,"trente"));
    	vect.push_back(A(30,"trente"));
     
         //on fait le trie
    	std::sort(vect.begin(),vect.end());
    	return 0;
    }

    Les résultats que j'obtiens avec GCC sous ubuntu sont :
    - sans le swap : 361 operation egale = 361s
    - avec le swap : 88 operation swap et 185 operation egale = 229 s

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Au faite, pour ceux qui veule tester,pour enlever le swap, il suffit de commenter la definition de std::swap

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    personne n'as d'idée???

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Bon,
    j'ai trouvé un truc pour ceux que cela intéresse :
    http://www.tantalon.com/pete/cppopt/...l.htm#Swapping

  6. #6
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Il serait intéressant de faire des tests sur des gros conteneurs bien remplis. Et chronométrer, avec différentes méthodes, sur différentes plateformes, et avec une machine dédiée (je veux dire un machine où aucune appli ne tourne, pas même les démons/services réseau etc.)

Discussions similaires

  1. la différence entre les algorithmes d'approximation et les algorithmes d'opptimisatio
    Par ch_hanen dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 29/06/2007, 10h52
  2. Un Pseudo-langage pour les algorithmes
    Par Terminator dans le forum Algorithmes et structures de données
    Réponses: 19
    Dernier message: 24/02/2006, 10h28
  3. Les algorithmes génétiques
    Par fred9510 dans le forum Intelligence artificielle
    Réponses: 3
    Dernier message: 27/01/2005, 10h27
  4. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18

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