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 扩展有几个疑问:
- 使用方法代替函数是否存在性能差异,特别是因为方法在内部转换为函数?
def x:Int=10
和 val x:Int=10
之间有性能差异吗?
- 我读到,按名称调用参数实际上是一种不接受任何参数的方法。现在,如果方法不是对象,我们如何使用方法作为参数值?
您所询问的表达方式之间没有显着差异。
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
时才会影响性能。
考虑下面的代码,我将方法和函数作为参数传递给 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=10
和val x:Int=10
之间有性能差异吗?- 我读到,按名称调用参数实际上是一种不接受任何参数的方法。现在,如果方法不是对象,我们如何使用方法作为参数值?
您所询问的表达方式之间没有显着差异。
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
时才会影响性能。