在scala的字节代码中不必要的加载和存储指令

时间:2013-10-10 12:51:15

标签: scala pattern-matching

我只是对模式匹配及其相应的字节代码进行了一些调查。

val a = Array(1,2,3,4)
a.map {
  case i => i + 1
}

对于上面的代码,我使用javap并获取map中的匿名函数的字节代码:

public int apply$mcII$sp(int);
Code:
   0: iload_1       
   1: istore_2      
   2: iload_2       
   3: iconst_1      
   4: iadd          
   5: ireturn       

所以在我看来,在第0行我们推送一个int(参数),然后在第1行我们加载int而在第2行我们将它推回去......这里的目的是什么?< / p>

谢谢!

2 个答案:

答案 0 :(得分:2)

老兄,试试-optimise

  public int apply$mcII$sp(int);
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
         0: iload_1       
         1: iconst_1      
         2: iadd          
         3: ireturn 

使用

scala> :javap -prv -

然后像

scala> :javap -prv $line4/$read$$iw$$iw$$anonfun$1

答案 1 :(得分:1)

这不是一个真正的答案,因为我无法弄清楚为什么会这样。我希望这些观察结果至少有用:)


我在Scala 2.10中看到以下字节码:

public int apply$mcII$sp(int);
    Code:
       0: iload_1       ; var1 -> stack
       1: istore_2      ; var2 <- stack
       2: iload_2       ; var2 -> stack
       3: iconst_1      ; 1 -> stack
       4: iadd      
       5: istore_3      ; var3 <- stack
       6: iload_3       ; var3 -> stack
       7: ireturn       ; return <- stack

前两个指令似乎只是将var1的值移动到var2,然后将var2作为参数移动到堆栈。在iadd之后可以观察到相同的结果,其中结果存储在var3中没有明显的原因,因为ireturn无论如何都会从堆栈中返回值。