在Scala中,List()和Nil之间是否有_performance_差异?

Tuxdna

假设我有一个接受对象和列表的函数:

case class Point(x: Int, y: Int)
def f1(w: Point, l: List[String]) =  { /* do something /* }

我通常会这样使用它:

val w = Point(1,1)
val lst = List("Hello", "world")
f1(w, lst) // non empty list

很多时候,我需要使用空列表作为第二个参数来调用该函数:

f1(w, List()) // empty list
f1(w, Nil) // empty list

最后两行之间是否有任何性能差异?

我认为使用List()将调用List.apply()方法。Scala编译器会对其进行优化Nil吗?

编辑1

这不是Scala的副本:Nil vs List()

注意:Nilvs之间是否有任何性能差异List()Scala编译器在这里进行任何优化吗?

约翰南德伦

这样的课

import collections.immutable.List

class Test {
  val l = List() // or Nil
}

编译他们两个,然后检查生成的字节码 javap -v

List() 给出:

5: getstatic     #26                 // Field scala/collection/immutable/Nil$.MODULE$:Lscala/collection/immutable/Nil$;
8: putfield      #14                 // Field l:Lscala/collection/immutable/List;

Nil给出:

5: getstatic     #24                 // Field scala/collection/immutable/Nil$.MODULE$:Lscala/collection/immutable/Nil$;
8: putfield      #13                 // Field l:Lscala/collection/immutable/Nil$;

因此,两者的字节码(和性能)相同。但是,可能还有其他选择的理由,正如戈文德在评论中所链接的问题中所述。

深入兔子洞

查看源List()是List.apply()的糖,它是这样实现的:

def apply[A](xs: A*) = xs.toList

toList来自TraversableOnceto[List]隐式接受一个的调用CanBuildFrom[Nothing, A, List[A]],在这种情况下将是List.canBuildFrom,而反过来来自ReusableCBF,该构建器然后将用.apply()调用++= the empty array,然后build()

对我来说,如何消除/转换成getstaticforList()还不是很清楚。(或者我在途中错过了一些聪明的东西)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Objective-C中,Nil和nil与Null之间的差异

来自分类Dev

“ +:”和“ ::”之间的Scala差异

来自分类Dev

C++ 中的指针和引用之间是否有任何开销差异

来自分类Dev

在Scala中,最终val和val之间的差异

来自分类Dev

Scala中f(a,b)和f(a)(b)之间的差异

来自分类Dev

JavaScript中的“ let”和“ var”之间是否存在性能差异

来自分类Dev

Scala中的String和List之间的区别?

来自分类Dev

Lisp中的(list nil)和'(nil)有什么区别?

来自分类Dev

Bash中$ *和$ @之间的差异

来自分类Dev

R 中 %% 和 % 之间的差异

来自分类Dev

swift中nil和空字符串之间基于性能的差异

来自分类Dev

在使用angular $ filter和带有Filter后缀的名称之间是否存在性能差异?

来自分类Dev

正确索引ORDER BY子句后,ASC和DESC之间是否有性能差异?

来自分类Dev

std :: copy和容器的copy构造函数之间是否有性能差异?

来自分类Dev

您是否有测试来显示反应堆map()和flatMap()之间的差异?

来自分类Dev

正确索引ORDER BY子句后,ASC和DESC之间是否有性能差异?

来自分类Dev

PC 和 Mac 之间是否有任何键盘字符代码差异?

来自分类Dev

:=和[[之间有行为差异吗?

来自分类Dev

lua中nil的类型和nil的类型之间有什么区别?

来自分类Dev

在C ++中,执行时间差异(带有按引用传递的函数和按值传递的函数之间)是否显着?

来自分类Dev

平方函数和直接在Rust中调用powi(2)之间是否存在性能差异?

来自分类Dev

HL7 ORU消息中的ORC和OBR公用元素之间是否存在差异?

来自分类Dev

在Rails 5中,“ model.save”和“ model.errors.empty”之间是否存在功能差异?

来自分类Dev

平方函数和直接在Rust中调用powi(2)之间是否存在性能差异?

来自分类Dev

在 Common Lisp 中,函数和宏之间是否存在性能差异?

来自分类Dev

Python 2.7中的设置对称差异和带有突变的设置对称差异之间有什么区别?

来自分类Dev

R中的修复和编辑之间的差异

来自分类Dev

Powershell中getElementById和getElementsByName之间的差异

来自分类Dev

VTK中顶点和点之间的差异

Related 相关文章

  1. 1

    在Objective-C中,Nil和nil与Null之间的差异

  2. 2

    “ +:”和“ ::”之间的Scala差异

  3. 3

    C++ 中的指针和引用之间是否有任何开销差异

  4. 4

    在Scala中,最终val和val之间的差异

  5. 5

    Scala中f(a,b)和f(a)(b)之间的差异

  6. 6

    JavaScript中的“ let”和“ var”之间是否存在性能差异

  7. 7

    Scala中的String和List之间的区别?

  8. 8

    Lisp中的(list nil)和'(nil)有什么区别?

  9. 9

    Bash中$ *和$ @之间的差异

  10. 10

    R 中 %% 和 % 之间的差异

  11. 11

    swift中nil和空字符串之间基于性能的差异

  12. 12

    在使用angular $ filter和带有Filter后缀的名称之间是否存在性能差异?

  13. 13

    正确索引ORDER BY子句后,ASC和DESC之间是否有性能差异?

  14. 14

    std :: copy和容器的copy构造函数之间是否有性能差异?

  15. 15

    您是否有测试来显示反应堆map()和flatMap()之间的差异?

  16. 16

    正确索引ORDER BY子句后,ASC和DESC之间是否有性能差异?

  17. 17

    PC 和 Mac 之间是否有任何键盘字符代码差异?

  18. 18

    :=和[[之间有行为差异吗?

  19. 19

    lua中nil的类型和nil的类型之间有什么区别?

  20. 20

    在C ++中,执行时间差异(带有按引用传递的函数和按值传递的函数之间)是否显着?

  21. 21

    平方函数和直接在Rust中调用powi(2)之间是否存在性能差异?

  22. 22

    HL7 ORU消息中的ORC和OBR公用元素之间是否存在差异?

  23. 23

    在Rails 5中,“ model.save”和“ model.errors.empty”之间是否存在功能差异?

  24. 24

    平方函数和直接在Rust中调用powi(2)之间是否存在性能差异?

  25. 25

    在 Common Lisp 中,函数和宏之间是否存在性能差异?

  26. 26

    Python 2.7中的设置对称差异和带有突变的设置对称差异之间有什么区别?

  27. 27

    R中的修复和编辑之间的差异

  28. 28

    Powershell中getElementById和getElementsByName之间的差异

  29. 29

    VTK中顶点和点之间的差异

热门标签

归档