2013-10-10 39 views
5

我只是對模式匹配及其相應的字節代碼做了一些調整。scala的字節碼中不必要的加載和存儲指令

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

對於上面的代碼中,我使用javap的,並得到了內部地圖annonymous功能的字節碼:

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行中將其推回...此處的目的是什麼?

謝謝!

回答

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 - 

和我使用的2.9.3這裏,那麼像

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

。似乎輸出是不一樣的... – darkjh

+0

@darkjh古代歷史!我的2.9別名甚至不運行javap。我只注意到你的錯誤反思:當你調查某些東西時,結果與你所期望的相反。感謝那一個。 –

1

這不是一個真正的答案,因爲我無法弄清楚爲什麼發生這種情況。我希望這些意見將至少有幫助:)


我看到下面的字節碼在斯卡拉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之後可以觀察到相同的結果,因爲ireturn無論如何都返回堆棧中的值,所以結果存儲在var3中並無明顯原因。