簡體   English   中英

Scala性能:命令式與功能式

[英]Scala Performance: imperative vs functional style

我是Scala的新手,只是在閱讀Scala示例 在第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方式”(功能性),因此效率更高。

注意:作者確實提到功能樣式確實使用更多的內存。

這取決於。 如果您查看Scala源碼,通常會在“幕后”使用命令式風格以提高性能-但在許多情況下,正是這些調整使您可以編寫高性能的功能代碼。 因此,通常您可以想出足夠快速的功能解決方案,但是您必須小心並知道自己的工作(尤其是有關數據結構的信息)。 例如,第二個示例中的數組concat不太好,但可能還不錯-但是在這里使用List並將其與:::連接起來可能會過大。

但這僅是經過教育的猜測,如果您實際上沒有衡量性能。 在復雜的項目中,很難預測性能,尤其是當諸如對象創建和方法調用之類的東西被編譯器和JVM越來越優化時。

我建議從功能樣式開始。 如果速度太慢,請對其進行分析。 通常有更好的功能解決方案。 如果沒有,您可以將命令式(或兩者結合)作為最后的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM