【发布时间】:2011-01-24 19:26:47
【问题描述】:
我写了两种方法来检查那里的性能
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 的第一个实现在性能方面以及在可读性方面都很好:))
【问题讨论】:
-
polygene 的回答是你应该听的。但是,如果您真的认为差异很重要,请将每个版本运行十亿次左右,看看是否有任何可测量的差异。然后回来告诉我们。
-
为什么重要,你的程序是否只有 3 行长,重要的是一个单独的 if 语句运行多快或多慢?
-
当我们谈到这个主题时,我想证明将左大括号放在与条件相同的行上比其他大括号样式更有效。
-
我会说OP需要被称赞为努力,挖掘字节码等。如果方向正确,这种决心对OP来说会很好。
标签: java performance micro-optimization