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

Langage Java Discussion :

Concaténation versus construction


Sujet :

Langage Java

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2004
    Messages
    218
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 218
    Points : 91
    Points
    91
    Par défaut Concaténation versus construction
    Bonjour,

    J'aimerais votre avis : j'ai un code sous les yeux qui fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    String soapMessage + " " ;
    soapMessage += "chaine de caractères";
    soapMessage += "chaine de caractères";
    soapMessage += "chaine de caractères";
    soapMessage += "chaine de caractères";
    ...
    return soapMessage;
    Si mes infos sont bonnes, ceci engendre l'instanciation d'un nouveau String en mémoire à chaque ligne ce qui nous fait autant de String que de lignes, voir plus;

    j'aimerais remplacer tout cela par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    StringBuffer soapMessage = new StringBuffer();
    soapMessage.append("chaine de caractères");
    soapMessage.append("chaine de caractères");
    soapMessage.append("chaine de caractères");
    soapMessage.append("chaine de caractères");
    ....
     
    return soapMessage.toString();
    Que je pense moins gourmand.

    ai-je raison ou tort ?

    Merci pour vos commentaires

    Stujava

  2. #2
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Dans un cas aussi simple, le compilateur va probablement optimiser comme s'il n'y avait qu'une string. Mais si tu fais la meme chose dans une boucle, il vaut mieux utiliser un StringBuilder qui evitera de passer par des chaines temporaires inutiles.

  3. #3
    Membre éprouvé
    Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    Octobre 2012
    Messages
    628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : Octobre 2012
    Messages : 628
    Points : 1 256
    Points
    1 256
    Par défaut
    A vérifier, mais il me semble que si le compilo ne peut pas faire une seule string à la compilation, il créer de lui même un StringBuffer (ou un StringBuilder?) Pour gérer la concaténation. Donc c'est pareil, mais le builder est plus pratique selon moi...
    «Dieu ne joue pas aux dés.» - Albert Einstein. Et pan! 30 ans de retard dans la théorie quantique!
    «Tout n'est pas politique, mais la politique s'intéresse à tout.» - Nicolas Machiavel. Et surtout à ceux qui ne s'y intéressent pas.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Cafeinoman Voir le message
    A vérifier, mais il me semble que si le compilo ne peut pas faire une seule string à la compilation, il créer de lui même un StringBuffer (ou un StringBuilder?) Pour gérer la concaténation.
    La concaténation se fait d'office au niveau du compilateur par un StringBuilder. Donc dans le pire des cas (pas d'optimisation possible par le compilateur pour une raison ou une autre), tu auras pour chaque ligne une String ET un StringBuilder instanciés
    Difficile de prévoir ce que va faire le compilateur. Il est préférable pour une construction de String progressive de passer par un StringBuilder. Note: StringBuilder, pas StringBuffer. Ce dernier étant synchronisé, il est beaucoup plus lent sur les plateformes multicoeur.

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Je confirme : l'utilisation de l'opérateur + (ou +=) sur une String passe par l'utilisation d'un StringBuilder.
    Donc ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    soapMessage += "chaine de caractères";
    est en réalité équivalent à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    soapMessage = new StringBuilder(soapMessage).append("chaine de caractères").toString();
    Il y a donc bien 2 nouveaux objets à chaque ligne (un StringBuilder puis un String).



    Il est en effet préférable de passer par un StringBuilder (ou StringBuffer) pour faire cela.
    Comme le dit tchize_ on préfèrera StringBuilder qui n'est pas synchronisé (même si cela ne doit pas avoir de gros impact coté performance, car je pense que la JVM peut faire sauter la synchronisation puisqu'on utilise une variable locale).



    Toutefois il faut nuancer : la JVM arrive à optimiser les concaténation (via l'option OptimizeStringConcat désormais activé par défaut, et connu défavorablement car elle avait entrainé de gros bugs à la sortie de Java 7).
    D'autant plus qu'il est ici question de quelques lignes, ce qui ne devrait avoir aucun impact.
    On pourrait donc privilégier l'opérateur + plus lisible.

    Voir même ceci qui n'utilisera qu'un seul StringBuilder... voir même aucun si on a des constantes comme ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    String soapMessage = " " 
    	+ "chaine de caractères"
    	+ "chaine de caractères"
    	+ "chaine de caractères"
    	+ "chaine de caractères";
    return soapMessage;
    (le compilateur peut alors concaténer les constantes dès la compilation)




    Bref : l'opérateur + n'est généralement pas un problème.

    Ce qui peut être problématique c'est l'opérateur += ou équivalent (ex: s = s + "...") si on l'utilise plusieurs fois car cela entraine à chaque fois la création d'un StringBuilder/String.


    Dans un code comme ceux là c'est insignifiant, mais dans une boucle cela peut être catastrophique si on a beaucoup d'itérations.
    Par exemple ce simple code est un tueur de CPU :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    		String s = "";
    		for (int i=0; i<100_000; i++) {
    			s += i;
    		}
    Sur mon poste il faut plus de 35 secondes pour en arriver à bout, alors que le code équivalent avec un StringBuilder tourne autour des 40ms :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    		StringBuilder sb = new StringBuilder();
    		for (int i=0; i<100_000; i++) {
    			sb.append(i);
    		}
    		String s = sb.toString();
    Seul problème le StringBuilder rend le code un peu moins lisible.
    C'est juste dommage qu'on ne puisse pas utiliser les opérateurs += et + sur un StringBuilder...



    a++


    PS : à noter qu'avec Java 9 l'opérateur + ne devrait plus être remplacé par un StringBuilder, mais par l'invocation d'une méthode dynamique.
    Cela permettra aux JVMs d'optimiser encore plus facilement l'optimisation des concaténations.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JBuilder 7] Construction d'executable natif
    Par renaudfaucon dans le forum JBuilder
    Réponses: 3
    Dernier message: 24/11/2006, 22h28
  2. Char(x) -> chaine concaténée d'espaces ?
    Par rgz dans le forum Débuter
    Réponses: 7
    Dernier message: 27/06/2003, 11h59
  3. Concaténation vertical ???
    Par loaded dans le forum Langage SQL
    Réponses: 10
    Dernier message: 07/05/2003, 15h44
  4. Concaténer TStrings
    Par Tuxxy dans le forum Composants VCL
    Réponses: 8
    Dernier message: 07/03/2003, 12h30
  5. Concaténation de String et Integer
    Par Ingham dans le forum Langage
    Réponses: 5
    Dernier message: 21/01/2003, 17h26

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