Scala Performance:命令VS機能スタイル
-
29-09-2020 - |
質問
私はScalaに慣れていて、。第2章では、作者にはQuickSortの2つの異なるバージョンがあります。
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 <)))
}
}
.
解決
は依存します。あなたがスカラの情報源を見ると、パフォーマンスがあるために「フードの下」を使用していることが多い - しかし、多くの場合、これらの微調整は 書き込みパフォーマント機能コード。だから通常は十分に速い機能的な解決策を思いつくことができますが、あなたは注意してあなたがしていることを知っている(特にあなたのデータ構造に関して)。例えば。 2番目の例ではアレイの連れは良くありませんが、おそらく悪すぎることはありませんが、ここにリストを使用し、それらを順にしてください。:::::::::::::
しかし、それは実際に measure の性能であれば、教育を受けた推測以上のものではありません。複雑なプロジェクトでは、特にオブジェクトの作成やメソッド呼び出しのようなものがコンパイラとJVMによってもっと最適化されたものとして、パフォーマンスを予測するのは本当に困難です。
機能的なスタイルで始めることをお勧めします。遅すぎる場合は、それをプロファイルしてください。通常はより良い機能的解決策があります。そうでなければ、最後のリゾートとして命令型(または両方のミックス)を使用することができます。
所属していません StackOverflow