【发布时间】:2011-03-20 16:36:07
【问题描述】:
我是 Scala 新手,正在阅读 Scala By Example。在第 2 章中,作者有 2 个不同版本的 Quicksort。
一种是命令式风格:
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 方式”(函数式)是首选,因此效率更高。
注意:作者确实提到了函数式样式确实使用了更多的内存。
【问题讨论】:
-
“简洁”与“可读”不同。证据:the J programming language
-
我想我现在明白了,Scala By Example 的作者试图展示另一种更简洁的解决问题的方法。总而言之:您在代码的所有部分中尽可能简洁地编程,这样您就可以获得最大的简洁性和生产力。然后运行您的应用程序,如果它太慢,请对其进行分析并优化瓶颈部分。
标签: scala performance functional-programming imperative