Soy nuevo en Scala y solo estaba leyendo Scala By Example. En el capítulo 2, el autor tiene 2 versiones diferentes de Quicksort.Scala Rendimiento: estilo imperativo vs funcional
Uno de ellos es el estilo imperativo:
def sort(xs: Array[Int]) {
def swap(i: Int, j: Int) {
val t = xs(i); xs(i) = xs(j); xs(j) = t
}
def sort1(l: Int, r: Int) {
val pivot = xs((l + r)/2)
var i = l; var j = r
while (i <= j) {
while (xs(i) < pivot) i += 1
while (xs(j) > pivot) j -= 1
if (i <= j) {
swap(i, j)
i += 1
j -= 1
}
}
if (l < j) sort1(l, j)
if (j < r) sort1(i, r)
}
sort1(0, xs.length - 1)
}
Uno de ellos es el estilo funcional:
def sort(xs: Array[Int]): Array[Int] = {
if (xs.length <= 1) xs
else {
val pivot = xs(xs.length/2)
Array.concat(
sort(xs filter (pivot >)),
xs filter (pivot ==),
sort(xs filter (pivot <)))
}
}
La ventaja obvia el estilo funcional tiene sobre el estilo imperativo es la concisión. ¿Pero qué hay del rendimiento? Dado que usa recursividad, ¿pagamos la penalización de rendimiento tal como lo hacemos en otros lenguajes imperativos como C? O, como Scala es un lenguaje híbrido, se prefiere el "modo Scala" (funcional), por lo tanto, más eficiente.
Nota: El autor mencionó que el estilo funcional usa más memoria.
posible duplicado de [¿Es la programación funcional de scala más lenta que la codificación tradicional?] (Http://stackoverflow.com/questions/2794823/is-scala-functional-programming-slower-than-traditional-coding) – missingfaktor
"Concise" no es lo mismo que "legible". Evidencia: [el lenguaje de programación J] (http://en.wikipedia.org/wiki/J_ (programming_language)) –
Creo que ahora entiendo que el autor de Scala By Example intenta mostrar otra forma de resolver el problema que es mucho más conciso. Para resumir: programa lo más conciso posible en todas las partes de tu código, para que obtengas máxima concisión, productividad. Luego ejecute su aplicación, y si es demasiado lenta, perfilela y optimice las partes de cuello de botella. – sivabudh