加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala性能:命令式与功能性风格

发布时间:2020-12-16 08:59:12 所属栏目:安全 来源:网络整理
导读:我是 Scala的新手,只读了 Scala By Example.在第二章中,作者有两个不同版本的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 =
我是 Scala的新手,只读了 Scala By Example.在第二章中,作者有两个不同版本的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源代码,通常会使用“引擎盖下”的命令式样式以实现性能 – 但在许多情况下,这些调整恰好可以编写高性能的代码.所以通常你可以提出一个足够快的功能解决方案,但你必须小心并知道你做了什么(特别是关于你的数据结构).例如.第二个例子中的数组连接不是很好,但可能不是太糟糕 – 但是在这里使用Lists并用:::连接它们会有点过分.

但是,如果你没有真正衡量绩效,那只不过是受过教育的猜测.在复杂的项目中,很难预测性能,尤其是对象创建和方法调用等事情越来越多地被编译器和JVM优化.

我建议从功能风格开始.如果它太慢,请对其进行分析.通常有一个更好的功能解决方案.如果没有,您可以使用命令式(或两者兼而有之)作为最后的手段.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读