簡體   English   中英

比較Java字節碼的簡單循環?

[英]Comparing java bytecode for a simple loop?

我試圖找出編譯時這兩個循環有多相似:

for (int i = 0; i < result.length; i++){
   result[i] = array[((i < index) ? i : i + 1)];
}

for (int i = 0; i < result.length; i++){
   if(i < index) result[i] = array[i];
   else result[i] = array[i + 1];
}

我發現很難找出每個循環的操作在哪里。
我應該如何比較這兩個循環? 謝謝

這是我使用javap -c運行程序時得到的:

Compiled from "Test.java"
public class Test {
  public Test();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return        

  public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class Test
       3: dup           
       4: invokespecial #3                  // Method "<init>":()V
       7: pop           
       8: return        

  public void Test();
    Code:
       0: bipush        10
       2: newarray       int
       4: astore_1      
       5: iconst_0      
       6: istore_2      
       7: iload_2       
       8: bipush        10
      10: if_icmpge     23
      13: aload_1       
      14: iload_2       
      15: iload_2       
      16: iastore       
      17: iinc          2, 1
      20: goto          7
      23: aload_0       
      24: aload_1       
      25: iconst_5      
      26: invokespecial #4                  // Method removeAndTrimConcise:([II)[I
      29: pop           
      30: bipush        10
      32: newarray       int
      34: astore_1      
      35: iconst_0      
      36: istore_2      
      37: iload_2       
      38: bipush        10
      40: if_icmpge     53
      43: aload_1       
      44: iload_2       
      45: iload_2       
      46: iastore       
      47: iinc          2, 1
      50: goto          37
      53: aload_0       
      54: aload_1       
      55: iconst_5      
      56: invokespecial #5                  // Method removeAndTrim:([II)[I
      59: pop           
      60: return        
}

應該大致介於newarray (我假設您在每個循環之前創建一個新數組)和goto (如您所見,將控制流返回到上一行,從而進行循環)之間:

第一循環:

   2: newarray       int
   4: astore_1      
   5: iconst_0      
   6: istore_2      
   7: iload_2       
   8: bipush        10
  10: if_icmpge     23
  13: aload_1       
  14: iload_2       
  15: iload_2       
  16: iastore       
  17: iinc          2, 1
  20: goto          7

第二:

  32: newarray       int
  34: astore_1      
  35: iconst_0      
  36: istore_2      
  37: iload_2       
  38: bipush        10
  40: if_icmpge     53
  43: aload_1       
  44: iload_2       
  45: iload_2       
  46: iastore       
  47: iinc          2, 1
  50: goto          37

它們似乎幾乎相同。

將它們放在兩個單獨的文件中,唯一的區別是循環。 重新運行javap並進行比較。

但是,除了滿足您的好奇心之外,真正的答案是“沒有關系”。 沒有性能優化。 您應該編寫更清晰,更易讀的內容。 部分原因在於口味。 我的首選是三元運算符。

我建議一次循環編譯一次程序,另一次循環編譯一次。 或者,制作2種方法,並用要使用的循環類型標記它們,然后編譯它們。 通過Text Diff http://www.textdiff.com/中的復制粘貼來輕松查看兩者之間的區別。

這將消除重復循環的編譯器優化的所有問題(我對這個主題不甚了解,這可能會發生,但我認為可能會發生)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM