Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala性能:命令式与功能式_Scala_Performance_Functional Programming_Imperative - Fatal编程技术网

Scala性能:命令式与功能式

Scala性能:命令式与功能式,scala,performance,functional-programming,imperative,Scala,Performance,Functional Programming,Imperative,我刚接触Scala,只是在阅读。在第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;

我刚接触Scala,只是在阅读。在第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方式函数,因此效率更高


注意:作者确实提到了功能性样式确实使用了更多内存。

这取决于。如果您查看Scala源代码,通常会在后台使用命令式样式来提高性能,但在许多情况下,正是这些调整允许您编写性能良好的功能代码。因此,通常您可以提出一个足够快的功能性解决方案,但您必须小心,并了解您所做的工作,尤其是在数据结构方面。例如,第二个示例中的数组concat不太好,但可能也不太坏-但是在这里使用列表并将它们与::结合使用会有点过分

但如果你不实际衡量绩效,那就只是有根据的猜测。在复杂的项目中,很难预测性能,尤其是在对象创建和方法调用等事情越来越被编译器和JVM优化的情况下


我建议从实用风格开始。如果速度太慢,请对其进行配置。通常有更好的功能解决方案。如果没有,您可以使用命令式样式或两者的混合作为最后手段。

可能重复的简明与可读不同。证据:我想我现在明白了,Scala By Example的作者正试图展示另一种更简洁的解决问题的方法。总而言之:您的程序在代码的所有部分都尽可能简洁,因此您可以获得最大的简洁性和效率。然后运行你的应用程序,如果速度太慢,就分析它,并优化瓶颈部分。但这有点违背目的,对吗?我的意思是,Scala被誉为连接函数式编程和对象编程的第一种语言。但是,如果您不能确定使用函数式方式编程是否有效,那么关心性能的人最终会使用Java方式编写Scala?请看示例。哪一个看起来更容易理解?函数式风格实际上告诉您算法的功能:选择一个轴心元素,对较小的元素进行排序,对较大的元素进行排序,然后将所有元素放在一起。与命令式示例相比,这是一个巨大的优势,命令式示例主要关注循环变量和数组索引。因此,如果功能性风格运作良好,我们通常是黄金,但我们仍然有命令式风格作为后备解决方案。但是,不要设置面向对象==命令。类和对象在函数上下文中可以很好地工作。在任何大型项目中,您都会发现,实际上只有很少的代码必须非常高效。在这些情况下,您确实经常需要退回到命令式构造。Scala支持这一点。在剩下的时间里,您最好以这样一种方式进行编码,即您的设计在代码中尽可能清楚地显示出来。它可以是功能性的、过程性的、面向对象的,或者它们的一些组合。Scala支持所有这些。@ShaChris23您期望什么?当然,你不能保证函数式编程总是有效的,就像用命令式或OO风格编写程序并不总是有效的一样。函数式编程不是一个能自动提高程序效率的灵丹妙药,这与Scala本身无关。在任何一种编程风格中,如果你不能免费获得效率,你仍然需要自己去思考。感谢@Landei、@Dave和@Jesper提供的所有深思熟虑的评论。