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 :

Lenteur du vector<string>


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    D�cembre 2010
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2010
    Messages : 3
    Par d�faut Lenteur du vector<string>
    Bonjour,

    Je souhaite cr�er et remplir un vecteur de strings � partir d'un fichier texte. J'ai suivi le conseil de la faq :
    http://cpp.developpez.com/faq/cpp/?p...ream_iterators

    Mon fichier contient 300000 lignes de 2 colonnes. Soit 600000 strings � stocker. Pour faire simple, disons que la taille ne varie pas (en pratique elle varie). Voici le code que j'ai �crit :

    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
    // ouvre le fichier
    ifstream file("fichier.txt",ios::in) ;
     
    // crée le vecteur de strings
    vector<string> list ;
     
    // réserve la mémoire
    int size = 600000 ;
    list.reserve(size) ;
     
    // remplit le vecteur
    copy(istream_iterator<string>(file),istream_iterator<string>(),back_inserter(list)) ;
     
    // ferme le fichier
    file.close() ;
    J'obtiens bien un vecteur de 600000 strings, pas de probl�me. Mon souci est dans le temps d'ex�cution : 1.4 secondes. Je trouve que c'est anormalement lent. Alors j'ai test� avec un tableau de strings :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // ouvre le fichier
    ifstream file("fichier.txt",ios::in) ;
     
    // crée le tableau de strings
    int size = 600000 ;
    string * list = new string[size] ;
     
    // remplit le tableau
    for ( int i = 0 ; i < size ; i++ )
    	file >> list[i] ;
     
    // ferme le fichier
    file.close() ;
    Cette solution avec le tableau de strings s'ex�cute en 0.9 secondes. Je pensais que le vecteur �tait mieux adapt�, et qu'il serait plus rapide. J'aimerais savoir si c'est "normal" ou si j'ai mal compris quelque chose. Je ne suis pas s�r de bien faire la r�serve de m�moire avec le vecteur.

  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
    D'abord, comment as-tu effectu� tes mesures?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    D�cembre 2010
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2010
    Messages : 3
    Par d�faut
    Pour mesurer le temps d'ex�cution, j'ai utilis� la fonction clock(). Par exemple, pour mesurer la premi�re solution :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // Début de la mesure
    clock_t t1 = clock() ;
     
    // Ce que je veux mesurer
    ifstream file("fichier.txt",ios::in) ;
    vector<string> list ;
    int size = 600000 ;
    list.reserve(size) ;
    copy(istream_iterator<string>(file),istream_iterator<string>(),back_inserter(list)) ;
    file.close() ;
     
    // Fin de la mesure
    clock_t t2 = clock() ;
    cout << (float)(t2-t1)/CLOCKS_PER_SEC << endl ;
    Je n'ai pas fait de boucle pour moyenner le temps sur plusieurs it�rations. Mais j'ai ex�cut� plusieurs fois ce bout de code, et j'obtiens sensiblement (� 0.1 sec pr�s) les m�mes valeurs.

  4. #4
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de caf�
    Inscrit en
    Mai 2007
    Messages
    1 048
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 39
    Localisation : France

    Informations professionnelles :
    Activit� : Consommateur de caf�
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par d�faut
    SI tu compares la fonction cpy � ta fonction for, tu verras que copy effectue des choses en plus.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    template<class InputIterator, class OutputIterator>
      OutputIterator copy ( InputIterator first, InputIterator last, OutputIterator result )
    {
      while (first!=last) *result++ = *first++;
      return result;
    }
    De plus le back_inserter rajoute un appel de fonction pour chaque ligne. Sur 100 ligne aucune diff�rence, sur 30000 �a joue. Apr�s �a vas d�pendre de l'optimisation faite par le compilateur, a v�rifi� dans le code machine, ce n'est qu'une hypoth�se.

    le copy + iterator + back_inserter n'est pas une combinaison de performances, mais de facilit� d'utilisation et de relecture.

  5. #5
    r0d
    r0d est d�connect�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 299
    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 299
    Billets dans le blog
    2
    Par d�faut
    As-tu test� avec les options d'optimisations ad�quates? (Il ne sert � rien de faire des tests de rapidit� en mode Debug par exemple).

  6. #6
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    std::vector::reserve() est ton ami -- et c'est ce que fait le tableau.
    Tu as les deque aussi sinon.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  7. #7
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Salut,
    Citation Envoy� par Musix Voir le message
    [...]
    Remarque de m�thode :
    Tu fais varier au - 3 param�tres :
    std::vector => new []
    std::copy => for
    std::istream_iterator =>operator>>

    Comment peux tu dire que tes diff�rences de perf ne tiennent qu'au changement std::vector vs new ? Comment peux-tu garantir que cela ne vient pas du changement d'it�rateurs de flux en lecture directe ?

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    D�cembre 2010
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2010
    Messages : 3
    Par d�faut
    Merci pour toutes vos r�ponses

    Premi�re faute : j'�tais en mode Debug
    Deuxi�me faute : tu as raison 3DArchi, trop de param�tres varient � la fois.

    J'utilisais d�j� la fonction reserve(). Aussi bizarre que cela paraisse, �a am�liore peu les performances. J'ai test� en mode release cette fois :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    t1 = clock();
    vector.reserve(size) ; // Test 1 : sans // Test 2 : avec
    copy(istream_iterator<string>(file),istream_iterator<string>(),back_inserter(vector)) ; 
    t2 = clock() ;
    Je passe de 0.56 sec � 0.48 sec en ajoutant la r�serve.

    Quant � la comparaison vector vs [], j'obtiens d�sormais les m�mes ordres de grandeur que rmdak. Lorsque les deux structures sont remplies par l'op�rateur >> les performances sont quasiment identiques.

  9. #9
    Membre �clair�

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    18
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 18
    Par d�faut
    J'utilisais d�j� la fonction reserve(). Aussi bizarre que cela paraisse, �a am�liore peu les performances.
    La r� allocation de m�moire lorsqu'un vector est plein est cens�e �tre "intelligente" au sens ou elle r�serve non pas une case suppl�mentaire mais plut�t double (pas sur exactement de la quantit�) la taille du vector en m�moire.

    Sa me rappel une entr�e de la FAQ Stroustrup ou il parle du reserve vers la fin : http://www2.research.att.com/~bs/bs_...low-containers

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. vector<map<string, string> >::iterator ?
    Par scheme dans le forum C++
    R�ponses: 11
    Dernier message: 10/12/2010, 09h32
  2. R�ponses: 2
    Dernier message: 18/09/2010, 22h33
  3. Probl�me std::vector <std::string >
    Par TNT89 dans le forum SL & STL
    R�ponses: 9
    Dernier message: 31/05/2008, 17h51
  4. conversion vector to string
    Par identifiant_bidon dans le forum C++
    R�ponses: 18
    Dernier message: 15/11/2007, 10h40
  5. [jsp] Comment faire un cast de Vector to String?
    Par adil_vpb dans le forum Servlets/JSP
    R�ponses: 2
    Dernier message: 05/03/2007, 11h29

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