En Java, es una práctica recomendada realizar la concatenación de cadenas con StringBuilder debido al mal rendimiento de las cadenas que se añaden utilizando el operador +. ¿Se recomienda la misma práctica para Scala o se ha mejorado el lenguaje sobre cómo java realiza su concatenación de cadenas?¿La concatenación de cadenas en Scala es tan costosa como en Java?
Respuesta
Scala utiliza cadenas de Java (java.lang.String
), por lo que su concatenación de cadenas es la misma que la de Java: lo mismo está ocurriendo en ambos. (El tiempo de ejecución es el mismo, después de todo.) Hay una clase especial StringBuilder
en Scala, que "proporciona una API compatible con java.lang.StringBuilder
"; ver http://www.scala-lang.org/api/2.7.5/scala/StringBuilder.html.
Pero en términos de "mejores prácticas", creo que la mayoría de la gente generalmente considera mejor escribir código simple y claro que el código máximo eficiente, excepto cuando hay un problema real de rendimiento o una buena razón para esperar uno. El operador +
realmente no tiene "bajo rendimiento", es solo que s += "foo"
es equivalente a s = s + "foo"
(es decir, crea un nuevo objeto String
), lo que significa que, si está haciendo muchas concatenaciones a (lo que parece) "una sola cadena", puede evitar crear objetos innecesarios — y volver a copiar varias partes anteriores de una cadena a otra — utilizando StringBuilder
en lugar de String
. Por lo general, la diferencia no es importante. (Por supuesto, "simple código, claro" es un poco contradictoria: el uso de +=
es más simple, utilizando StringBuilder
es más clara, pero aún así, la decisión por lo general debe basarse en consideraciones de código de escritura en lugar de consideraciones de rendimiento menores..)
Scala usa java.lang.String
como el tipo de cadenas, por lo que está sujeto a las mismas características.
Concatenación de cadenas Scalas funciona de la misma manera que lo hace Javas.
val x = 5
"a"+"b"+x+"c"
se traduce a
new StringBuilder()).append("ab").append(BoxesRunTime.boxToInteger(x)).append("c").toString()
StringBuilder es scala.collection.mutable.StringBuilder. Esa es la razón por la cual el valor adjunto a StringBuilder está encuadrado por el compilador.
Puede comprobar el comportamiento descompilando el bytecode con javap.
I desea agregar: si tiene una secuencia de cadenas, entonces ya existe un método para crear una nueva cadena de ellas (todos los elementos, concatenados). Se llama mkString
.
Ejemplo: (http://ideone.com/QJhkAG)
val example = Seq("11111", "2222", "333", "444444")
val result = example.mkString
println(result) // prints "111112222333444444"
- 1. ¿Qué tan ineficiente es la concatenación de cadenas en Javascript?
- 2. Concatenación de cadenas y Autoboxing en Java
- 3. ¿Es realmente tan costosa la secuencia exe ejecutable de Unix?
- 4. Cadenas de concatenación en Menos
- 5. Eficiencia de concatenación de cadenas de Java
- 6. Concatenación de cadenas en Jinja
- 7. Concatenación de cadenas en EL
- 8. Concatenación de cadenas en Lua
- 9. Concatenación de cadenas en MySQL
- 10. Concatenación de cadenas PHP
- 11. Concatenación de cadenas en Java: cuándo usar +, StringBuilder y concat
- 12. Uso ineficiente de la concatenación de cadenas
- 13. concatenación de cadenas con Null
- 14. concatenación de cadenas
- 15. ¿Es Ruby tan multiplataforma como Java?
- 16. Cadenas de concatenación con
- 17. Cadenas de concatenación en macros - C++
- 18. concatenación de cadenas vs memorias intermedias de cadena en Javascript
- 19. Cadenas de concatenación en JSP EL?
- 20. ¿El estilo de Java Groovy es tan rápido como Java?
- 21. Construir un ArrayList de cadenas en Java tan simple como se puede en Javascript
- 22. Cadenas de concatenación no funciona como se esperaba
- 23. PHP: variables en cadenas sin concatenación
- 24. ¿Es Java 7 al menos tan estable como Java 6?
- 25. Concatenación de cadenas con espacios
- 26. La concatenación de cadenas no funciona en SQLite
- 27. Hacer un operador de concatenación de cadenas en R
- 28. ¿Qué tan bien funciona Scala en comparación con Java?
- 29. Es SQLite cursor.getCount operación costosa en Android
- 30. Java: StringBuffer y concatenación
En mi caso estoy muy preocupado por el rendimiento por lo tanto, por qué estoy haciendo la pregunta. ¡Gracias por toda la información! – bionicseraph
AFAIK, la JVM trata automáticamente las concatenaciones '+' repetidas en una expresión de la misma manera que lo haría con un buffer de cadena. Entonces, no hay diferencia de rendimiento realmente. – aishwarya
@aishwarya: el JLS recomienda que los compiladores optimicen 'foo + bar + baz + bip' al equivalente de' nuevo StringBuilder (foo) .append (barra) .append (baz) .append (bip) .toString() 'y '" foo "+" bar "+" baz "+" bip "' to '" foobarbazbip "', pero esos son casos bastante angostos. Y no creo que las JVM (a diferencia de los compiladores) generalmente hagan algún tipo de optimización en ese sentido, aunque podría estar equivocado. – ruakh