我试图找出这两个循环在编译时有多相似:
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
}
答案 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/中复制面食,以便轻松查看两者之间的差异。
这将删除重复循环的任何编译器优化问题(我不太了解该主题可能会发生这种情况,但我认为可能)。