我在Scala和Java的性能上遇到了一个非常奇怪的差异。 我已经在Java中实现了一个倒置计数例程,然后逐行将其移植到Scala,因为所有惯用的Scala版本(使用List
或Stream
)要么非常缓慢,要么会崩溃并出现堆栈溢出/内存错误。但是这个版本也很慢——而Java版本只需要22ms就可以处理100000个整数数组,而Scala版本需要3秒钟。下面是Scala版本的相关代码:
def mergeAndCountInversions(xs: Array[Int], aux: Array[Int], left: Int, right: Int) = {
xs.copyToArray(aux)
val m = left + (right - left) / 2
var i = left
var j = m + 1
var inv: Long = 0
for (k <- left to right) {
if (i > m) {
xs(k) = aux(j)
j += 1
} else if (j > right) {
xs(k) = aux(i)
i += 1
} else if (aux(j) < aux(i)) {
xs(k) = aux(j)
j += 1
inv += (m - i) + 1
} else {
xs(k) = aux(i)
i += 1
}
}
inv
}
有什么想法可以改进这个例程的性能吗?
更新:Scala版本性能不佳完全是我的错。第一条语句不必要地将整个数组复制到辅助数组中。当只复制所需部分时,性能与Java相当,正如它应该的那样。
for(k <- left to right optimized)
。 - senia