def 和 val 之间的性能差异

Performance difference between def and val

考虑下面的代码,我将方法和函数作为参数传递给 map()

  val list1:List[Int]=List(10,20,30)

  def func1(x:Int):Int={
      x+10
  }

  list1.map(func1)
  list1.map(_+10)

我对 ETA 扩展有几个疑问:

您所询问的表达方式之间没有显着差异。

val x 产生私有字段。

请注意,与 vs.map(x => f(x)) 相比,vs.map(_+10) 内联函数。但是无论如何你都必须创建一个函数对象。

一个 call-by-name 参数 => X 是一个 () => X 在幕后。

在 REPL 中,使用 javap 显示代码。 -c 用于代码,-v 用于详细。

scala> vs.map(f)
res0: List[Int] = List(2, 3, 4, 5, 6, 7, 8, 9, 10, 11)

scala> :javap -pv -
[snip]

其中一个区别是,val 值是在加载 class 时测量的,而 def 是在调用时测量的。

一个简单的例子是,假设您在 class 中有 100K 个 val 变量(为了论证),系统可能需要很长时间才能启动。但是,如果您有一个 def A,其中声明了 100K val。只有在调用 A 时才会影响性能。