我写了两种方法来检查性能
public class Test1 {
private String value;
public void notNull(){
if( value != null) {
//do something
}
}
public void nullNot(){
if( null != value) {
//do something
}
}
}
并在编译后检查它的字节码
public void notNull();
Code:
Stack=1, Locals=1, Args_size=1
0: aload_0
1: getfield #2; //Field value:Ljava/lang/String;
4: ifnull 7
7: return
LineNumberTable:
line 6: 0
line 9: 7
StackMapTable: number_of_entries = 1
frame_type = 7 /* same */
public void nullNot();
Code:
Stack=2, Locals=1, Args_size=1
0: aconst_null
1: aload_0
2: getfield #2; //Field value:Ljava/lang/String;
5: if_acmpeq 8
8: return
LineNumberTable:
line 12: 0
line 15: 8
StackMapTable: number_of_entries = 1
frame_type = 8 /* same */
}
这里有两个操作码用于实现 if 条件:在第一种情况下,它使用 ifnull- 检查堆栈的顶部值是否为 null-,在第二种情况下,它使用 if_acmpeq- 检查堆栈中顶部的两个值是否相等-
那么,这会对性能产生影响吗? (这将帮助我证明 null 的第一个实现在性能方面以及可读性方面都很好:))
原文由 asela38 发布,翻译遵循 CC BY-SA 4.0 许可协议
比较生成的字节码几乎没有意义,因为大多数优化都是在运行时使用 JIT 编译器进行的。我猜测在这种情况下,任一表达式都同样快。如果有任何区别,那可以忽略不计。
这不是您需要担心的事情。寻找全局优化。