def和val之间的性能差异

时间:2017-02-08 05:05:02

标签: scala callbyname

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

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

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

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

关于ETA扩展我几乎没有问题:

  • 使用方法代替函数是否存在性能差异,特别是因为该方法在内部转换为函数?
  • def x:Int=10val x:Int=10之间是否存在性能差异?
  • 我已经读过,call-by-name参数实际上是一个不接受任何参数的方法。现在,如果方法不是对象,我们如何使用方法作为参数值?

2 个答案:

答案 0 :(得分:2)

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

val x会招致一个私人领域。

请注意,与vs.map(_+10)相比,vs.map(x => f(x))会内联函数。但是你必须在任何情况下创建一个函数对象。

名称调用参数=> 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]

答案 1 :(得分:0)

其中一个不同之处是,val值是在加载类时测量的,而def是在调用时测量的。{/ p>

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