比较java字节码的简单循环?

时间:2012-01-26 10:03:39

标签: java loops bytecode

我试图找出这两个循环在编译时有多相似:

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        
}

3 个答案:

答案 0 :(得分:3)

大致应该在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

他们似乎完全相同。

答案 1 :(得分:2)

将它们放在两个单独的文件中,唯一的区别是循环。重新运行javap并进行比较。

但真正的答案,除了满足你的好奇心之外,是“无所谓”。没有性能优化。你应该写一个更清晰,更易读的。这部分是品味问题。我的偏好是三元运算符。

答案 2 :(得分:1)

我建议用一个循环编译一次程序,用另一个循环编译一次。或者,制作2个方法并用你将要使用的循环类型标记它们,然后编译它们。在文本差异http://www.textdiff.com/中复制面食,以便轻松查看两者之间的差异。

这将删除重复循环的任何编译器优化问题(我不太了解该主题可能会发生这种情况,但我认为可能)。