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 :

STL et optimisation


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 59
    Points : 95
    Points
    95
    Par défaut STL et optimisation
    Bonjour a tous, quelqu'un sait il quelle est la plus rapide de ces 2 manières de copier des containers différents (ou bien si il existe une meilleure manière) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    std::copy<std::map<std::string, unsigned int>::const_iterator,std::deque<std::pair<std::string, unsigned int>>::iterator>(in.begin(),in.end(),out.begin());
     
    // OU
     
    for (std::map<std::string, unsigned int>::const_iterator it = in.begin(); it != in.end(); ++it) out.push_back(*it);
    Et aussi si il est plus rapide d'utiliser :

    ou

    pour avoir un itérateur sur le dernier élément d'un container.


    Merci

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    (pas la peine d'expliciter les paramètres templates comme ça)

    1. Ca n'a rien à voir, std::copy suppose que la destination a déjà une taille suffisante pour recevoir la copie, alors que push_back redimensionne la destination au besoin. L'équivalent aurait été soit d'utiliser std::back_inserter dans le permier, ou un accès indicé dans le second. Et ensuite au final le code sera le même, c'est juste qu'avec std::copy tu écris moins de code et tu as moins de chances de te tromper.

    2. Là encore ça n'a rien à voir. Ils pointent (potentiellement) sur le même élément mais end() -1 est un iterator alors que rbegin() est un reverse_iterator. De plus, si begin() == end() (ie. le conteneur est vide), end() - 1 va t'envoyer dans les choux.

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Le plus simple est d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boost::push_back(out, in);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boost::copy(in, out.begin());
    selon l'effet désiré.
    Boost ftw

  4. #4
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 59
    Points : 95
    Points
    95
    Par défaut
    Citation Envoyé par Laurent Gomila Voir le message
    (pas la peine d'expliciter les paramètres templates comme ça)

    1. Ca n'a rien à voir, std::copy suppose que la destination a déjà une taille suffisante pour recevoir la copie, alors que push_back redimensionne la destination au besoin. L'équivalent aurait été soit d'utiliser std::back_inserter dans le permier, ou un accès indicé dans le second. Et ensuite au final le code sera le même, c'est juste qu'avec std::copy tu écris moins de code et tu as moins de chances de te tromper.

    2. Là encore ça n'a rien à voir. Ils pointent (potentiellement) sur le même élément mais end() -1 est un iterator alors que rbegin() est un reverse_iterator. De plus, si begin() == end() (ie. le conteneur est vide), end() - 1 va t'envoyer dans les choux.
    1) Si std::copy fait la meme chose que la boucle, dans ce cas il est preferable d'utiliser la boucle pour éviter l'appel de la fonction copy non ? (j'utilise un acces indicé a la place de l'iterateur maintenant avec la destination construite avec la bonne taille)

    2) Oui je sais qu'un est un iterator et l'autre un reverse_iterator mais je me demandais si la stl ne prennait pas plus de temps a construire un reverse_iterator qu'un iterator du fait de sa spécialité (travailler a l'envers), et je vérifie la taille du tableau.

    En fait je vais plutot utiliser la fonction back pour récuperer un pointeur sur le dernier element : element = &tableau.back(); et ainsi eviter d'utiliser les iterateur juste pour récuperer le dernier element du tableau.

    Loufoque : merci mais je n'utilise pas boost, est il plus rapide que la stl ?

    Merci

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2007
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 59
    Points : 95
    Points
    95
    Par défaut
    Je viens de faire des tests (en mode debug sous visual c++ 2008) :

    - std::copy est un poil plus rapide que la boucle
    - un reverse_iterator est beaucoup plus lent qu'un iterator
    - Un iterator (--tableau.end()) est plus rapide qu'un pointeur (&tableau.back()) pour manipuler le dernier element d'un tableau

    Au total avec std::copy et l'iterator a la place de la boucle et du pointeur, j'ai gagné 200ms (sur 11 secondes au total) environ

  6. #6
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    un test en mode débug? Ca veut pas dire grand chose...

  7. #7
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    La validité d'un bench en debug est quasiment nulle, et ce d'autant plus avec du C++ moderne qui se repose à fond sur l'inlining.
    Edit : Grillé...
    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.

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Bien entendu, il vaut mieux utiliser des reverse iterators, c'est tellement plus pratique...
    Boost ftw

Discussions similaires

  1. Optimisation de votre SGBDR et de vos requêtes...
    Par SQLpro dans le forum Langage SQL
    Réponses: 35
    Dernier message: 11/01/2013, 11h49
  2. Réponses: 6
    Dernier message: 27/06/2007, 16h44
  3. [langage]Problème de temps de lecture, optimisation
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 08/01/2003, 08h47
  4. [Kylix] [BCB] pb avec la STL
    Par pykoon dans le forum EDI
    Réponses: 1
    Dernier message: 29/12/2002, 12h56
  5. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 11/06/2002, 10h24

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