La concaténation des chaînes de caractères en scala est-elle aussi coûteuse qu'en Java?

en Java, c'est une bonne pratique courante de faire la concaténation des chaînes avec StringBuilder en raison de la mauvaise performance de l'ajout de chaînes à l'aide de l'opérateur+. La même pratique est-elle recommandée pour Scala ou le langage s'est-il amélioré sur la façon dont java exécute sa concaténation de chaînes?

42
demandé sur bionicseraph 2011-12-22 23:12:21

4 réponses

Scala utilise des chaînes Java ( java.lang.String ), de sorte que la concaténation de ses chaînes est la même que celle de Java: la même chose se produit dans les deux. (Le moteur d'exécution est le même, après tout.) Il existe une classe spéciale StringBuilder dans Scala, qui" fournit une API compatible avec java.lang.StringBuilder "; voir http://www.scala-lang.org/api/2.7.5/scala/StringBuilder.html .

mais en termes de "meilleures pratiques", je pense que la plupart des gens le considéreraient généralement mieux vaut écrire du code simple et clair que du code efficace au maximum, sauf s'il y a un problème de performance réel ou une bonne raison d'en attendre un. L'opérateur + n'a pas vraiment de "mauvaise performance", c'est juste que s += "foo" est équivalent à s = s + "foo" (c'est-à-dire qu'il crée un nouvel objet String ), ce qui signifie que, si vous faites beaucoup de concaténations à (ce qui ressemble à) "une chaîne simple", vous pouvez éviter de créer des objets inutiles - et recopier à plusieurs reprises plus tôt portions d'une chaîne à l'autre - en utilisant un StringBuilder au lieu d'un String . Généralement, la différence n'est pas importante. (Bien sûr, " simple, clear code "est légèrement contradictoire: utiliser += est plus simple, utiliser StringBuilder est plus clair. Toutefois, la décision devrait généralement être fondée sur des considérations de rédaction de code plutôt que sur des considérations mineures de rendement.)

38
répondu ruakh 2012-09-12 13:26:31

Scalas chaîne concaténation fonctionne de la même manière que Javas.

val x = 5
"a"+"b"+x+"c"

se traduit par

new StringBuilder()).append("ab").append(BoxesRunTime.boxToInteger(x)).append("c").toString()

StringBuilder est scala.collection.mutable.StringBuilder . C'est la raison pour laquelle la valeur ajoutée à StringBuilder est encadrée par le compilateur.

vous pouvez vérifier le comportement en décompilant le bytecode avec javap.

20
répondu kiritsuku 2011-12-22 19:29:18

je veux ajouter: si vous avez une séquence de chaînes, alors il y a déjà une méthode pour en créer une nouvelle (tous les éléments, concaténés). Ça s'appelle mkString .

exemple: ( http://ideone.com/QJhkAG )

val example = Seq("11111", "2222", "333", "444444")
val result = example.mkString
println(result) // prints "111112222333444444"
4
répondu Sarge Borsch 2014-06-02 16:41:27

Scala utilise java.lang.String comme type de chaîne, il est donc soumis aux mêmes caractéristiques.

2
répondu Daniel C. Sobral 2011-12-22 19:28:27