46 votes

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

En Java, il est courant de concaténer des chaînes de caractères avec StringBuilder en raison des mauvaises performances de l'ajout de chaînes de caractères à 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 ?

44voto

ruakh Points 68789

Scala utilise les chaînes de caractères de Java ( java.lang.String ), donc sa concaténation de chaînes de caractères est la même que celle de Java : la même chose se passe dans les deux cas. (Le temps d'exécution est le même, après tout.) Il existe une fonction spéciale StringBuilder en Scala, qui "fournit une API compatible avec la classe 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 est préférable d'écrire un code simple et clair plutôt qu'un code à l'efficacité maximale, sauf en cas de problème de performance réel ou de bonne raison d'en attendre un. Le site + 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 nouveau String ), ce qui signifie que, si vous effectuez de nombreuses concaténations vers (ce qui ressemble à) "une seule chaîne de caractères", vous pouvez éviter de créer des objets inutiles - et de recopier de manière répétée les portions précédentes d'une chaîne de caractères vers une autre - en utilisant un objet StringBuilder au lieu d'un String . En général, la différence n'est pas importante. (Bien sûr, "un code simple et clair" est légèrement contradictoire : l'utilisation de += est plus simple, en utilisant StringBuilder est plus clair. Mais tout de même, 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 mineures de performance).

21voto

sschaef Points 20242

La concaténation de chaînes de caractères 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.

6voto

Sarge Borsch Points 2044

J'aimerais ajouter que si vous avez une séquence de chaînes de caractères, il existe déjà une méthode pour créer une nouvelle chaîne de caractères à partir de celles-ci (tous les éléments, concaténés). Elle s'appelle mkString .

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

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

2voto

Daniel C. Sobral Points 159554

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X