Я новичок в Scala и просто читал Scala By Example. В главе 2 автор имеет две разные версии Quicksort.Scala Performance: императив против функционального стиля
Одним из них является обязательным стиль:
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)
}
Один функциональный стиль:
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 <)))
}
}
Очевидное преимущество функциональный стиль имеет более императивный стиль является краткость. Но как насчет производительности? Поскольку он использует рекурсию, мы платим за штраф за производительность, как и в других императивных языках, таких как C? Или, Scala является гибридным языком, предпочтительнее «Scala way» (функциональный), тем самым более эффективным.
Примечание: автор упомянул, что функциональный стиль использует больше памяти.
Возможный дубликат [Функциональное программирование scala медленнее, чем традиционное кодирование?] (Http://stackoverflow.com/questions/2794823/is-scala-functional-programming-slower-than-traditional-coding) – missingfaktor
«Краткий» это не то же самое, что «читаемый». Доказательства: [язык программирования J] (http://en.wikipedia.org/wiki/J_ (programming_language)) –
Думаю, теперь я понимаю, что автор Scala By Example пытается показать еще один способ решить проблему, которая намного более кратким. Подводя итог: вы программируете как можно более краткими во всех частях вашего кода, поэтому вы получите максимальную лаконичность, производительность. Затем запустите приложение, и если оно слишком медленное, профилируйте его и оптимизируйте узлы узких мест. – sivabudh