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 :

Optimiser la concaténation de String sous Java


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 19
    Points : 11
    Points
    11
    Par défaut Optimiser la concaténation de String sous Java
    Bonjour à tout le monde,

    J'ai lu dans différents articles que la concaténation de string (chaînes de caractères) peut être améliorée en terme de temps, et ceci en évitant l'utilisation de l'opérateur usuel '+' et en le remplaçant par l'usage de StringBuilder.

    Voici quelques liens utiles:
    1. http://kaioa.com/node/59
    2. http://www.venishjoe.net/2009/11/jav...ation-and.html

    Voici un exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    String str = new String('A');
    StringBuilder sb = new StringBuilder('A');
     
    for (int i=0; i<10000000; i++){
    str = str+'A';
    sb = sb.append('A');
    }
    Dans l'exemple précédent, les deux variables str et sb auront la même valeur au final, par contre la fonction StringBuilder.append prend moins de temps par rapport à la concaténation basée sur l'opérateur '+'.

    J'ai un programme très longue pour être copié ici, je voulais faire certaines améliorations, j'ai remplacé toute utilisation de '+' par le StringBuilder.append, ça a marché parfaitement dans le cas où la concaténation est à l'intérieur d'une boucle (comme dans l'exemple). Par contre, quant aux fonctions récursives, le StringBuilder bouffe beaucoup plus de temps que l'opérateur '+'. Je n'arrive pas à comprendre ce fait, ça me parait illogique !!!

    Je voudrais savoir si quelqu'un a déjà fait cette petite expérience (mais utile) de comparaison entre '+' et StringBuilder, et pourquoi ce dernier est meilleur seulement à l'intérieur de boucles.

    Merci d'avance.

  2. #2
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Ce qu'il faut voir, c'est que quand tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String s = s1 + s2;
    ce qui est fait par la machine c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String s = (new StringBuilder(s1) ).append(s2).toString();
    L'idée d'utiliser toi même le StringBuilder et donc de gagner en efficacité en évitant de recréer à chaque fois l'objet.

    Pour ce qui est de ton histoire de récursif, il faudrait voir exactement le code.

  3. #3
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Dans ta fonction récursive, tu ne dois pas faire de new StringBuilder. Il faut le faire une seule fois avant l'appel de la fonction et le passer en paramètre de la fonction.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 19
    Points : 11
    Points
    11
    Par défaut Merci quand même
    Citation Envoyé par dinobogan Voir le message
    Dans ta fonction récursive, tu ne dois pas faire de new StringBuilder. Il faut le faire une seule fois avant l'appel de la fonction et le passer en paramètre de la fonction.
    Puis-je avoir plus amples explications sur ce point ?
    il faut absolument pas faire "new StringBuilder()" à l'intérieur d'une fonction récursive ou il faut pas le faire seulement pour les variables passées en paramètre de la fonction ?

  5. #5
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par Laurent_3154 Voir le message
    Puis-je avoir plus amples explications sur ce point ?
    il faut absolument pas faire "new StringBuilder()" à l'intérieur d'une fonction récursive ou il faut pas le faire seulement pour les variables passées en paramètre de la fonction ?
    Puisque tu ne donnes pas la moindre ligne de ton code, j'avais activer le mode "boule de cristal" et avais supposé que tu faisais un new StringBuilder à chaque appel récursif. Est-ce le cas ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 19
    Points : 11
    Points
    11
    Par défaut Oui t'as raison
    Citation Envoyé par dinobogan Voir le message
    Puisque tu ne donnes pas la moindre ligne de ton code, j'avais activer le mode "boule de cristal" et avais supposé que tu faisais un new StringBuilder à chaque appel récursif. Est-ce le cas ?
    Je vais quand même simplifier mon code pour le mettre ici.
    Quant au "new StringBuilder()", oui j'en ai plein dans mon code

Discussions similaires

  1. [Date]Date sous Java != celle sous Access
    Par Cyborg289 dans le forum JDBC
    Réponses: 4
    Dernier message: 27/07/2005, 23h11
  2. [Système][Class-Path]cherche aide sous java pour fedoracore ou linux
    Par mickey hollywood dans le forum Général Java
    Réponses: 4
    Dernier message: 29/03/2005, 01h13
  3. [String][ASCII]Java / Python
    Par chrdou dans le forum Général Java
    Réponses: 8
    Dernier message: 18/02/2005, 14h35
  4. 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