2017-02-08 1 views
1

Рассмотрим следующий код, где я прохожу метод и функции в качестве параметра для отображения()Разница в производительности между Защиту и Вэл

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?
  • Я прочел, что параметр call-by-name фактически является методом, который не принимает никаких параметров. Теперь, если методы не являются объектами, как мы используем метод как значение параметра?

ответ

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] 
+0

=> X фактически() => X, то как мы вызываем функцию без() – codingsplash

+0

Определение вызова по имени - это просто, что ссылка оценивает выражение; он делает это, вызывая функцию. –

0

Одним из отличий является, val значения измеряются, когда класс загружается в то время как def измеряются при вызове.

Простым примером является то, что у вас есть переменные 100K val в классе (для аргументации), система может занять много времени. Но если у вас есть def A, в котором объявляется 100K val. Производительность будет срабатывать только при вызове A.