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 :

Optimisation vector ou list


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Par défaut Optimisation vector ou list
    J'ai vu dans un exemple de code de STL le code suivant censé etre plus rapide que la methode push_back :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    vector<T> v;
    ...
    v.resize(v.size()+1);
    T& newElement = v.back();
    En effet, il y a une copie en moins par rapport au code "habituel" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    T newElement;
    v.push_back(newElement);
    Mais je ne connais pas assez bien la methode resize() pour dire que le 1er exemple est plus rapide que le 2nd.
    Qu'en pensent les specialistes du forum ?

  2. #2
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    La principale différence c'est que push_back (si je ne me trompe pas) va doubler la mémoire allouée par le vector si il n'y a pas assez de mémoire déjà réservée.

    Le premier exemple va augmenter le vector d'un seul élément.

    Autrement dit, si ce code est appelé souvent, le premier exemple sera plus lent car réalocation intempestive, tandis que le second sera de moins en moins lent car de l'espace sera déjà alloué la plupart du temps (donc yaura uniquement de la copie).

    A voir si tu as plus besoin d'espace que de vitesse.

    Corrigez moi si je me trompe

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    C'est vrai que la fonction resize() pourrait rajouter des éléments en appelant juste le constructeur par défaut, sans utiliser le constructeur de copie comme le fait push_back().

    Pourtant quand je regarde les implémentations de la STL dont j'ai accès (VC2005 et gcc 3.4.4) toutes les deux implémentent resize(newSize) en appelant resize(newSize, T()), perdant ainsi la possibilité d'optimisation.

    Quelqu'un sait pourquoi ?

    NB : par contre, normalement, pas de différence au niveau gestion de la mémoire entre resize(size() + 1) et push_back().

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Sylvain Togni
    Pourtant quand je regarde les implémentations de la STL dont j'ai accès (VC2005 et gcc 3.4.4) toutes les deux implémentent resize(newSize) en appelant resize(newSize, T()), perdant ainsi la possibilité d'optimisation.

    Quelqu'un sait pourquoi ?
    Il n'y a normalement qu'un resize avec un argument par defaut.

    Il y a aussi des cas ou la tendance est de penser que la norme surspecifie certains membres (par exemple en donnant une implementation possible -- c'est une occurence du probleme general absolument pas propre aux normes de prendre une implementation pour une specification), c'est en particulier vrai dans le cadre de la nouvelle norme mais c'aurait pu etre le cas (et ce l'est potentiellement si il y a une permission de remplacer les arguments par defaut par une surcharge; dans du code de bibliotheque, j'ai tendance a considerer les arguments par defaut comme etant des fausses bonnes idees, surtout a cause des problemes qu'ils posent quand on veut passer la fonction... la surdefinition est une raison de plus).

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    La version 'push_back' me parait un peu plus sûre en cas de levée d'exception, mais peut-être que tu t'en fout

    MAT.

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Je me demande s'il ne s'agissait pas de la difference entre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    T newElement;
    Initialize(newElement);
    v.push_back(newElement);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    v.resize(v.size()+1);
    T& newElement = v.back();
    Initialize(newElement);
    Le gain est dans le cas ou copier l'objet apres l'appel a Initialize est plus couteux que celui de la copie d'un objet construit par defaut (c'est vraisemblablement le cas par exemple si Initialize introduit de l'allocation dynamique).

Discussions similaires

  1. Optimisation et display lists
    Par GLDavid dans le forum OpenGL
    Réponses: 9
    Dernier message: 08/04/2008, 18h41
  2. [Optimisation] singly linked list one pass
    Par jhaythem dans le forum C
    Réponses: 6
    Dernier message: 25/02/2008, 19h38
  3. optimisations(vbo,display list) + bsp
    Par delfare dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 07/03/2007, 09h34
  4. récuperer vector dans liste pour combobox
    Par bnreb10 dans le forum Interfaces Graphiques en Java
    Réponses: 33
    Dernier message: 08/08/2006, 10h20
  5. difference entre vector, deque, list et tableau
    Par salseropom dans le forum SL & STL
    Réponses: 8
    Dernier message: 03/01/2005, 13h35

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