web-dev-qa-db-fra.com

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

En Java, il est recommandé de faire la concaténation de chaînes avec StringBuilder en raison des mauvaises performances 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 a-t-il amélioré la façon dont Java effectue sa concaténation de chaînes?

45
bionicseraph

Scala utilise des chaînes Java (Java.lang.String), donc sa concaténation de chaînes est la même que celle de Java: la même chose se produit dans les deux. (Le runtime 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 considèrent généralement qu'il vaut mieux écrire du code simple et clair que du code à efficacité maximale, sauf lorsqu'il y a un problème de performances réel ou une bonne raison de s'attendre à un. Le + L'opérateur n'a pas vraiment de "mauvaises performances", 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 pour (ce qui ressemble) à "une seule chaîne", vous pouvez éviter de créer des objets inutiles - et recopier à plusieurs reprises des parties antérieures d'une chaîne à une autre - en utilisant un StringBuilder au lieu d'un String. Habituellement, la différence n'est pas importante. (Bien sûr, un "code simple et clair" est légèrement contradictoire: utiliser += est plus simple, utiliser StringBuilder est plus clair. Mais malgré tout, la décision devrait généralement être basée sur des considérations d'écriture de code plutôt que sur des considérations de performances mineures.)

44
ruakh

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

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

est traduit en

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 au StringBuilder est encadrée par le compilateur.

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

21
kiritsuku

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

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

val example = Seq("11111", "2222", "333", "444444")
val result = example.mkString
println(result) // prints "111112222333444444"
5
Sarge Borsch

Scala utilise Java.lang.String comme type pour les chaînes, il est donc soumis aux mêmes caractéristiques.

2
Daniel C. Sobral