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 :

string.Append(


Sujet :

SL & STL C++

  1. #1
    Membre éclairé Avatar de bilb0t
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    378
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 378
    Par défaut string.Append(
    Bonjour à tous,

    J'ai des problèmes de performances ds une fct récursive qui écrit ds un string genre:

    Je me demandais si la méthode:
    s.Append("..."); est plus rapide que s+="...";

    Ou sinon, existe-t-il une classe genre StringBuilder (C#) qui permet des manips de chaines plus performantes ?

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Append et += sont équivalents je pense, en tout cas il n'y a aucune raison que l'un soit plus rapide que l'autre.

    Il y a des méthodes pour optimiser l'utilisation des string (et plus généralement des conteneurs), si tu nous montre ton code je suis sur qu'on pourra te dire comment optimiser tout ça

  3. #3
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Pour optimiser tu peux faire une liste de strings.

    Et à la fin tu concatènes une fois le tout.

  4. #4
    Membre éclairé Avatar de bilb0t
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    378
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 378
    Par défaut
    Merci, c'est un peu compliquer de montrer mon code. Mais en gros ça fait ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void devNode(node *parentNode, string & ret)
    {
     ret += parentNode->GetValue();
     for(int i=0;i<parentNode->getNbChildNodes();i++)
     {
        devNode(parentNode->getChild(i),ret);
     }
    }
    Et plus mon arbre est grand, plus sa prend de temps. J'ai déja stocker ds une cache toute les valeurs que je récupérais dune DB ds GetValue, mais c'est encore lent.

  5. #5
    Membre éclairé Avatar de bilb0t
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    378
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 378
    Par défaut
    Citation Envoyé par Ti-R
    Pour optimiser tu peux faire une liste de strings.

    Et à la fin tu concatènes une fois le tout.
    Tu peux expliquer ? Parce que là, j'ai rein compris...

  6. #6
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    au lieu de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ret += parentNode->GetValue();
    tu peux faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    // Une list a la place d'une string pour ret
    ret.Add(parentNode->GetValue());
    à la fin
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
     
    // la tu comptes la taille de la chaîne
    int t_size(0);
    ret.Start();
    for(int i=ret.Nbe();i--;)
    {
    	t_size+=(*ret)->size();
    	ret++;
    }
     
    // tu créer ta chaîne
    char *_final=new char[t_size+1];
    char *pt_final=_final;
     
    // tu remplis la chaîne via memcpy
    int t_size_s;
    ret.Start();
    for(int i=ret.Nbe();i--;)
    {
    	t_size_s=(*ret)->size();
    	memcpy(pt_final,((char *)(*ret)),t_size_s);
    	pt_final+=t_size_s;
    	ret++;
    }
     
    // tu indiques que c'est une chaîne, et donc la fin de celle ci.
    *pt_final='\0';
     
    // ne pas oublier
    delete [] _final;
    C'est un speudo algo !!
    Bon ok j'avoue je suis fan des char * et du C

  7. #7
    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
    Le probleme c'est que la concaténation fait grossir ta chaine, donc réallocation + recopie à chaque fois, et ça coute cher.
    Essaye d'estimer au tout début la longueur de ta chaine, et appelle reserve() avec cette longueur estimée.

  8. #8
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Pour cela que je propose ma soluce
    Même si cela n'était pas explicité sur le pourquoi

Discussions similaires

  1. Réponses: 25
    Dernier message: 17/01/2015, 17h31
  2. éliminer un caractere d'un string
    Par no-vice dans le forum Langage
    Réponses: 5
    Dernier message: 09/08/2002, 14h55
  3. URGENT: retour de string
    Par Pinggui dans le forum CORBA
    Réponses: 4
    Dernier message: 15/07/2002, 09h47
  4. Réponses: 2
    Dernier message: 05/06/2002, 12h29
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 15h23

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