Performance 哪些Scala功能的性能较差

Performance 哪些Scala功能的性能较差,performance,scala,jvm,Performance,Scala,Jvm,我最近在想:由于Scala是在JVM上运行的,而后者针对某些类型的操作进行了优化,那么是否有一些特性在JVM上的实现效率很低,因此不鼓励使用这些特性?你能解释一下为什么他们效率低下吗 第一个候选者是函数式编程特性——据我所知,函数是带有apply方法的特殊类,与函数只是代码块的语言相比,这显然会产生额外的开销。性能调优是一个深刻而复杂的问题,但有三件事会立即浮现在脑海中 Scala集合有利于表现力,但不利于性能。 考虑: (1 to 20).map(x => x*x).sum val a

我最近在想:由于Scala是在JVM上运行的,而后者针对某些类型的操作进行了优化,那么是否有一些特性在JVM上的实现效率很低,因此不鼓励使用这些特性?你能解释一下为什么他们效率低下吗


第一个候选者是函数式编程特性——据我所知,函数是带有
apply
方法的特殊类,与函数只是代码块的语言相比,这显然会产生额外的开销。

性能调优是一个深刻而复杂的问题,但有三件事会立即浮现在脑海中

Scala集合有利于表现力,但不利于性能。 考虑:

(1 to 20).map(x => x*x).sum

val a = new Array[Int](20)
var i = 0
while (i < 20) { a(i) = i+1; i += 1 }  // (1 to 20)
i = 0
while (i < 20) { a(i) = a(i)*a(i); i += 1 }   // map(x => x*x)
var s = 0
i = 0
while (i < 20) { s += a(i); i += 1 }  // sum
s
好的,太好了!除非我们

trait Func_CB_C { def apply(c: Char, b: Boolean): Char }
val g = new Func_CB_C {
  def apply(c: Char, b: Boolean) = if (b) c.toUpper else c.toLower
}
def doOdd2(a: Array[Char], f: Func_CB_C) = {
  var i = 0
  while (i<a.length) { a(i) = f(a(i), (i&1)==1); i += 1 }
  a
}

val u = (1 to 1000).to[Vector].par
u.map(x => x*(x+1))
第二张地图更快,对吧,因为它是平行的

几乎没有!由于开销的原因,速度慢了10倍(在我的机器上;结果可能会有很大差异)

总结
除了代码中性能最关键的部分之外,这些问题通常是您永远不必担心的很多问题中的一小部分。还有很多,你最终会遇到,但正如我在评论中提到的,需要一本书才能涵盖其中相当一部分。请注意,在任何语言中都存在大量的性能问题,而优化往往很棘手。把你的努力放在重要的地方

这个问题需要一本书来充分回答。
trait Func_CB_C { def apply(c: Char, b: Boolean): Char }
val g = new Func_CB_C {
  def apply(c: Char, b: Boolean) = if (b) c.toUpper else c.toLower
}
def doOdd2(a: Array[Char], f: Func_CB_C) = {
  var i = 0
  while (i<a.length) { a(i) = f(a(i), (i&1)==1); i += 1 }
  a
}
val v = (1 to 1000).to[Vector]
v.map(x => x*(x+1))
val u = (1 to 1000).to[Vector].par
u.map(x => x*(x+1))