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 :

[list] concatenation push_back vs splice


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Par défaut [list] concatenation push_back vs splice
    j'ai un vecteur de listes que je veux concaténer. J'ai testé un push_back élément par élément et un splice. Résultat: le push_back est plus rapide ce qui m'étonne. Des explications ?

    PS: je n'ai pas besoin de garder les listes VL[x]


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void Merging(list<vector<int> > &L, vector<list<vector<int> > > &VL){
            unsigned k=VL.size();
    	for(int x=0; x<k; x++){
    		//L.splice(L.end(), VL[x]);
    		for(list<vector<int> >::iterator it=VL[x].begin(); it!=VL[x].end(); it++){
    			L.push_back(*it);
    		}
    	}
    }
    Merci

  2. #2
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Bonjour,

    C'est en effet extrêmement curieux. Je dirais même presque impossible vu que splice() a été conçu exactement pour satisfaire ce cas et doit normalement se résoudre à une poignée d'opérations ultra-cheap (réassigner 5 ou 6 pointeurs dans la plupart des cas), alors que chaque push_back fait une copie entière des noeuds de la liste à concaténer, et donc doit allouer autant de nouveaux nœuds en tapant dans le tas.

    Est-ce que le problème ne viendrait pas plutôt de la manière dont tu mesures ?

    Désolé, je ne connais pas ton expertise la dessus, donc au cas où, voici quelques banalités sur l'art compliqué du bench : (mais bon on ne sait jamais, perso j'ai si souvent pris des vessies pour des lanternes à cause de bench mal fait... )

    1) Toujours mesurer en release.

    2) La durée à mesurer doit être supérieure à environ 50ms, sinon la mesure n'est pas significative sur la plupart des OS (trop de fluctuations)

    3) Toujours refaire les mesures de nombreuses fois. (car il arrive que l'on se prenne des hiatus complètement incompréhensible, comme si l'ordinateur avait eu le hoquet )

    4) Si sur visual studio 2005 ou 2008, bien penser à définir _SCL_SECURE et _HAS_ITERATOR_DEBUGGING à zéro et à lancer le bench avec ctrl+F5 et pas F5 pour éviter d'attacher le debuggeur.

    5) Enfin attention aux effets de cache tordus. Je me souviens m'être fait avoir en beauté une fois sur un bench dont le but était aussi de comparer une méthode A et une méthode B. Je me suis rendu compte bien plus tard qu'il suffisait d'inverser l'ordre d'appel pour changer complètement les résultats ! Et en fait c'était toujours la deuxième appelée dans l'ordre chronologique du bench qui était nettement plus rapide que la première. Il me semble que c'est parce que la première méthode venait "chauffer" le cache avec des données qui étaient réutilisées juste après.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 18
    Par défaut
    Oops, désolé

    je m'étais trompé dans mes mesures. Effectivement, un splice et bien plus
    rapide que plusieurs push_back.
    En tous les cas, les conseils d'Arzar sont bien utiles

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/09/2007, 12h16
  2. concatenations des liste
    Par Johana dans le forum Hibernate
    Réponses: 2
    Dernier message: 07/09/2007, 21h38
  3. concatener deux listes
    Par GI_GI dans le forum Général VBA
    Réponses: 3
    Dernier message: 21/01/2007, 15h41
  4. Concatener une liste d'email de ma table
    Par totoalareunion dans le forum Access
    Réponses: 4
    Dernier message: 15/01/2007, 19h35
  5. concatener deux listes
    Par adel25 dans le forum C++
    Réponses: 1
    Dernier message: 22/09/2005, 12h56

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