Scala性能:势在必行的VS功能样式
-
29-09-2020 - |
题
我是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 Way”(功能)是优选的,从而更有效。
解决方案
取决于。如果您在Scala源中查看,通常有一个势在必行的样式“引擎盖下”,以便是表演 - 但在许多情况下准确地说,这些调整允许 You 写入表演者功能代码。因此,您通常可以提出一个足够快的功能解决方案,但您必须小心并知道您的工作(特别是您的数据结构)。例如。第二个例子中的阵列芯盘不太好,但可能不会太糟糕 - 但在这里使用列表并使用:::将是矫枉过正。
但是如果您实际上并不实际上测量的性能,那并不多。在复杂的项目中,它真的很难预测性能,特别是像对象创建和方法调用等事情,通过编译器和JVM获得更多更优化。
我建议从功能性风格开始。如果它太慢,简化了。通常有更好的功能解决方案。如果没有,您可以使用势在必行的样式(或两者的混合)作为最后的手段。
不隶属于 StackOverflow