Scala集合中的大小和长度是否生成相同的字节代码?

据我所知,根据诸如 Is the best Scala convention to invoke collection.size or collection.lengthScala Buffer: Size or Length?之类的问题,这些方法可能被视为“等同”或“同义词”,尽管不是“相同”.

但这是否意味着他们是一样的?

不要向我提供相同的意见或虚假的概念.告诉我他们什么时候不一样.

用坚硬的科学来支持你的主张!

字节代码就足够了.我对JIT特定的优化并不那么感兴趣.

我对世界目前的状况特别感兴趣,即最近的里程碑中的Scala 2.11.

解决方法

字符串和数组仍然包装在2.11中.

你应该训练你的手指输入s.length和arr.length.

这并不难,因为字符串和数组都有长度.

从Java进入Scala的人经常会决定是否在java.lang.String上使用这些方法或者使用方便的扩充.由于在我们需要从休息室到replenish it with donuts之前我们有一个有限的“决策预算”,因此作为一项政策问题,最好先做出一些这些决定.

万一没有什么比午餐或甜甜圈更好的讨论了:

22: invokevirtual #41                 // Method scala/Predef$.augmentString:(Ljava/lang/String;)Ljava/lang/String;
25: invokespecial #44                 // Method scala/collection/immutable/StringOps."<init>":(Ljava/lang/String;)V
28: invokevirtual #47                 // Method scala/collection/immutable/StringOps.size:()I


18: invokevirtual #39                 // Method scala/Predef$.intArrayOps:([I)Lscala/collection/mutable/ArrayOps;
21: invokeinterface #44,1           // InterfaceMethod scala/collection/mutable/ArrayOps.size:()I

等等,等待,你可以失去augmentString.

它是GenSeqLike引入长度并指定它“产生与大小相同的结果”. SeqLike以这种方式实现它.

事实上,String通过扩充到SeqLike获取一个size方法,特别是StringLike.这需要包装.实际上,要预测哪些调用需要换行或调度到扩展方法并不容易.

例如,长度的定义方式是不需要包装.那是因为StringOps是一个值类.实际上,它编译为String.length.

但是,StringOps上的apply方法(定义为对charat的调用以模拟数组应用)虽然以相同的方式定义,但调用扩展方法.

(当然,在JIT编译之后,一些操作码和分配可能没什么意义.)

scala> val s = "hello"
s: String = hello

scala> val n = s.length ; val i = s.size ; val c = s(4) ; s.slice(0,4)
n: Int = 5
i: Int = 5
c: Char = o
res0: String = hell

scala> :javap -prv -
  public $line4.$read$$iw$$iw$();
    flags: ACC_PUBLIC
    Code:
      stack=5,locals=7,args_size=1
         0: aload_0       
         1: invokespecial #32                 // Method java/lang/Object."<init>":()V
         4: aload_0       
         5: putstatic     #34                 // Field MODULE$:L$line4/$read$$iw$$iw$;
         8: aload_0       
         9: getstatic     #39                 // Field $line3/$read$$iw$$iw$.MODULE$:L$line3/$read$$iw$$iw$;
        12: invokevirtual #42                 // Method $line3/$read$$iw$$iw$.s:()Ljava/lang/String;

长度:

15: invokevirtual #47                 // Method java/lang/String.length:()I
        18: putfield      #22                 // Field n:I
        21: aload_0

新的StringOps或StringOops:

22: new           #49                 // class scala/collection/immutable/StringOps
        25: dup           
        26: getstatic     #54                 // Field scala/Predef$.MODULE$:Lscala/Predef$;
        29: getstatic     #39                 // Field $line3/$read$$iw$$iw$.MODULE$:L$line3/$read$$iw$$iw$;
        32: invokevirtual #42                 // Method $line3/$read$$iw$$iw$.s:()Ljava/lang/String;
        35: astore_2      
        36: astore_1      
        37: aload_2

StringOps.size:

38: invokespecial #57                 // Method scala/collection/immutable/StringOps."<init>":(Ljava/lang/String;)V
        41: invokevirtual #60                 // Method scala/collection/immutable/StringOps.size:()I
        44: putfield      #25                 // Field i:I
        47: aload_0       
        48: getstatic     #65                 // Field scala/collection/immutable/StringOps$.MODULE$:Lscala/collection/immutable/StringOps$;
        51: getstatic     #54                 // Field scala/Predef$.MODULE$:Lscala/Predef$;
        54: getstatic     #39                 // Field $line3/$read$$iw$$iw$.MODULE$:L$line3/$read$$iw$$iw$;
        57: invokevirtual #42                 // Method $line3/$read$$iw$$iw$.s:()Ljava/lang/String;
        60: astore        4
        62: astore_3      
        63: aload         4
        65: iconst_4

申请延期方法

66: invokevirtual #69                 // Method scala/collection/immutable/StringOps$.apply$extension:(Ljava/lang/String;I)C
        69: putfield      #28                 // Field c:C
        72: aload_0       
        73: getstatic     #65                 // Field scala/collection/immutable/StringOps$.MODULE$:Lscala/collection/immutable/StringOps$;
        76: getstatic     #54                 // Field scala/Predef$.MODULE$:Lscala/Predef$;
        79: getstatic     #39                 // Field $line3/$read$$iw$$iw$.MODULE$:L$line3/$read$$iw$$iw$;
        82: invokevirtual #42                 // Method $line3/$read$$iw$$iw$.s:()Ljava/lang/String;
        85: astore        6
        87: astore        5
        89: aload         6
        91: iconst_0      
        92: iconst_4

和切片:

93: invokevirtual #73                 // Method scala/collection/immutable/StringOps$.slice$extension:(Ljava/lang/String;II)Ljava/lang/String;
        96: putfield      #31                 // Field res0:Ljava/lang/String;
        99: return

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...