Java 中条件变量如何工作并存储在内存中?
How condition variables work and store in memory in Java?
//Case1
if(a > 5){
//..
}
//Case2
private static final int NUM1 = 5;
if(a > NUM1){
//..
}
/////////////////////////////////////////////
//Case3
if(a > 6 + b){
//..
}
//Case4
private static final int NUM2 = 6;
if(a > NUM2 + b){
//..
}
在Java
1. if 条件变量如何在 java 中起作用? (例如:if(a > 5) 5 是如何存储在内存中的?像 final 还是其他?)
2. 我应该使用 case2 而不是 case1 以获得更好的性能吗?
3. 我应该使用 case4 而不是 case3 以获得更好的性能吗?
for(int i = 0; i < 1000000000; i++){
if(a > 5){}
if(a > NUM){}
if(a > 6 + b){}
if(a > NUM + b){}
}
- 如果我进入循环,结果会改变吗?
我用这些语句编译代码并反汇编。
如您所见,整数文字之间的比较与 public static final
原语的比较没有区别。
奇怪的是,在某些 JVM 上,如果 bipush
和 iadd
比 iconst
更有效,则比较 (a>6+b) 可能比 (a>5) 更快.我个人不确定为什么 bipush
仅用于案例 3 和案例 4。如果有人可以阐明这一点,我会很感兴趣。
// method 1; if(a>5)
13: iload_1
14: iconst_5
15: if_icmple 25
18: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
21: iconst_1
22: invokevirtual #5 // Method java/io/PrintStream.println:(I)V
// method 2; if(a>NUM1)
25: iload_1
26: iconst_5
27: if_icmple 37
30: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
33: iconst_2
34: invokevirtual #5 // Method java/io/PrintStream.println:(I)V
// method 3; if(a > 6+b)
37: iload_1
38: bipush 6
40: iload_2
41: iadd
42: if_icmple 52
45: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
48: iconst_1
49: invokevirtual #5 // Method java/io/PrintStream.println:(I)V
// method 4; if(a > 6+b)
52: iload_1
53: bipush 6
55: iload_2
56: iadd
57: if_icmple 67
60: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
63: iconst_1
64: invokevirtual #5 // Method java/io/PrintStream.println:(I)V
67: return
//Case1
if(a > 5){
//..
}
//Case2
private static final int NUM1 = 5;
if(a > NUM1){
//..
}
/////////////////////////////////////////////
//Case3
if(a > 6 + b){
//..
}
//Case4
private static final int NUM2 = 6;
if(a > NUM2 + b){
//..
}
在Java
1. if 条件变量如何在 java 中起作用? (例如:if(a > 5) 5 是如何存储在内存中的?像 final 还是其他?)
2. 我应该使用 case2 而不是 case1 以获得更好的性能吗?
3. 我应该使用 case4 而不是 case3 以获得更好的性能吗?
for(int i = 0; i < 1000000000; i++){
if(a > 5){}
if(a > NUM){}
if(a > 6 + b){}
if(a > NUM + b){}
}
- 如果我进入循环,结果会改变吗?
我用这些语句编译代码并反汇编。
如您所见,整数文字之间的比较与 public static final
原语的比较没有区别。
奇怪的是,在某些 JVM 上,如果 bipush
和 iadd
比 iconst
更有效,则比较 (a>6+b) 可能比 (a>5) 更快.我个人不确定为什么 bipush
仅用于案例 3 和案例 4。如果有人可以阐明这一点,我会很感兴趣。
// method 1; if(a>5)
13: iload_1
14: iconst_5
15: if_icmple 25
18: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
21: iconst_1
22: invokevirtual #5 // Method java/io/PrintStream.println:(I)V
// method 2; if(a>NUM1)
25: iload_1
26: iconst_5
27: if_icmple 37
30: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
33: iconst_2
34: invokevirtual #5 // Method java/io/PrintStream.println:(I)V
// method 3; if(a > 6+b)
37: iload_1
38: bipush 6
40: iload_2
41: iadd
42: if_icmple 52
45: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
48: iconst_1
49: invokevirtual #5 // Method java/io/PrintStream.println:(I)V
// method 4; if(a > 6+b)
52: iload_1
53: bipush 6
55: iload_2
56: iadd
57: if_icmple 67
60: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
63: iconst_1
64: invokevirtual #5 // Method java/io/PrintStream.println:(I)V
67: return