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 :

std vector vs tableaux


Sujet :

SL & STL C++

  1. #1
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 54
    Par défaut std vector vs tableaux
    j'utilisais d'abord des tableaux de string puis je suis passé a des vector<string> pour des problemes de desallocation de memoire

    le passage de l'un a l'autre a effectivement diminue la memoire utilisée par le programme mais celui-ci est beaucoup plus lent qu'avant, à quoi cela peut-il etre du?

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    De la façon dont tu utilises ton tableau. Sans voir de code on ne pourra rien faire pour toi.

  3. #3
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    La manière de construire les string aussi. Tu as testé en release je suppose ?

  4. #4
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 54
    Par défaut
    le programme comporte pas mal de pages de code donc c'est un peu difficile de tout donner

    le release c'est quoi?

  5. #5
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Le mode sous lequel le compilateur ne rajoute pas d'informations de dé bogage. En principe, tu développes en mode debug et tu livres en omde release.

    Inutile de montrer tout le programme. Un exemple de la manière dont tu utilises ton vector (ou de la façon dont tu le charges) pourra peut-être servir de point de départ.

  6. #6
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Release désigne le mode de compilation optimisé, par opposition au mode Debug qui est fait pour le debuggage et est donc beaucoup plus lent.

    Si tu ne peux pas en dire plus sur ton code on ne pourra pas t'aider.

  7. #7
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 54
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    vector<string> tmp(x*y+1);
    for (int a=0 ; a< x*y ; a++){
           tmp[a]=mystringsort[a];
    }
    //puis je change certains elements en faisant des 
     
    tmp[a]="OA";
    c'est a peu pres chaque fois comme ca que les vector sont utilisés.

    ils sont egalement inseres dans des noeuds d'arbres et de listes chainees.

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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    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 290
    Billets dans le blog
    2
    Par défaut
    Je ne sais pas si ce sera mieux, mais ça peut être intéressant de tester:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     vector<string> tmp;
    for (int a=0 ; a< x*y ; a++){
           tmp.push_back(mystringsort[a]);
    }
     
    //puis je change certains elements en faisant des 
    tmp.push_back("OA");
    Sinon, qu'est-ce que "mystringsort"? Si c'est également un vector, tu peux tenter un simple tmp = push_back;
    Sinon, et de façon plus générale, la manipulation de tableaux doit être effectuée avec circonspection, car les performances peuvent s'en faire sentir. Par conséquent, il faut essayer de s'en passer lorsque cela est possible.

  9. #9
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    Citation Envoyé par r0d
    Je ne sais pas si ce sera mieux, mais ça peut être intéressant de tester:

    [code] vector<string> tmp;
    for (int a=0 ; a< x*y ; a++){
    tmp.push_back(mystringsort[a]);
    }
    pas mieux je suppose puisque ça oblige à réallouer de la mémoire pour "pusher" à chaque itération.

  10. #10
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 54
    Par défaut
    mystringsort est effectivement un vector

    pour le pushback (OA), je dois modifier certains elements du vector pas en rajouter a la fin

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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    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 290
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par mathher
    mystringsort est effectivement un vector
    erf, j'ai fais une faute de frappe dans mon précédent post. Tu as le droit de faire vector1 = vector2. Je suppose que ça doit être plus efficace que de copier les éléments un par un.
    Sinon, je ne sais pas.

  12. #12
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    vector<string> tmp(x*y+1);
    for (int a=0 ; a< x*y ; a++){
           tmp[a]=mystringsort[a];
    }
    Le vector est initialisé et appelle x*y + 1 fois le constructeur par défaut de string. Puis la boucle appelle x * y fois l'opérateur de multiplication et autant de fois l'opérateur de recopie de string. Il y a des chances en effet que, si, le vector est de grande taille et si les strings sont longues, ça plombe un peu les performances.

    Pour optimiser un peu, essayer peut-être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    vector<string> tmp;
    tmp.reserve( x*y+1);
    std::copy( mystringsort.begin(), mystringsort.end(), tmp.begin() );
    reserve() prépare le vector en lui pré-allouant la plmace nécessaire pour x*y+1 postes, sans les initialiser. Le constructeur par défaut de string n'est donc pas appelé "pour rien". L'appel à std::copy() qui suit copie les conteneurs proprement.

    Par la suite, en cas de besoin, voir si tu peux optimiser en stockant des string* et non des strings. Si les perfs à ce moment là restent nettement en dessous de celles que tu obtiens avec des tableaux de char*, heu...

    PS : pourquoi x*y+1 ??

  13. #13
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Sauf qu'à la fin, la dimension de tmp est toujours nulle... Il faut utiliser un std::back_inserter(tmp) à la place de tmp.begin()

  14. #14
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 54
    Par défaut
    +1 paske j'ai besoin de x*y+1 éléments et pas x*y c'est tout
    merci de vos reponses je vais essayer tout ca bientot et je verrai si ca m'aide ou pas

  15. #15
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 54
    Par défaut
    les vector sont chaque fois renvoyés par des méthodes et insérés dans des structures de données.
    pour ces insertions, je suppose qu'ils sont copiés intégralement. la lenteur du programme ne peut-elle pas venir des ses copies multiples alors qu'avec des tableaux il ne passe que le pointeur du tableau?

  16. #16
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    dans ce cas il suffit d'utiliser les références (constantes ou non).

  17. #17
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Si ça se trouve, les strings utilisent un paradigme qui fait que le contenu n'est pas recopié, donc il faut que tu restestes. Et fais gaffe à l'erreur d'Hérode que j'ai indiqué.

  18. #18
    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
    Par défaut
    j'utilisais d'abord des tableaux de string puis je suis passé a des vector<string> pour des problemes de desallocation de memoire
    Un tableau se désalloue tout seul en fin de vie.
    Tu dois confondre avec un pointeur.

    Je ne sais pas si ce sera mieux, mais ça peut être intéressant de tester:
    C'est bien évidemment encore pire.

    Si on veut copier un vector, il suffit d'appeler son constructeur de copie.

Discussions similaires

  1. Tableaux et autres std::vector
    Par DeusXL dans le forum SL & STL
    Réponses: 1
    Dernier message: 04/11/2005, 13h58
  2. std::sort() sur std::vector()
    Par tut dans le forum SL & STL
    Réponses: 20
    Dernier message: 05/01/2005, 19h15
  3. char[50] et std::vector<>
    Par tut dans le forum SL & STL
    Réponses: 9
    Dernier message: 12/10/2004, 13h26
  4. Réponses: 8
    Dernier message: 26/08/2004, 18h59
  5. Sauvegarde std::vector dans un .ini
    Par mick74 dans le forum MFC
    Réponses: 2
    Dernier message: 12/05/2004, 13h30

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