在Java和.Net中,我听说首先使用null if (null == myObject)
比首先使用对象if (myObject == null)
更高效。虽然我认为这可能是真的,但我不确定并希望了解SO用户。就个人而言,我认为如果首先引用该对象会更好,但如果首先使用null会有任何性能提升,我会选择它。
答案 0 :(得分:7)
他们完全一样。如果存在差异,任何编译器都会进行交换,因为绝对没有功能差异。
答案 1 :(得分:5)
出乎意料的是,他们在Java中的编译方式不同:
if (myObject == null);
if (null == myObject);
编译到
8 aload_1
9 ifnonnull 12 (+3)
12 aconst_null
13 aload_1
14 if_acmpne 17 (+3)
(这是使用javac 1.6.0_24
编译的。)
首先放置对象引用会产生两条指令,并将null
第一个结果放在三条指令中。在此基础上,if (myObject == null)
可能更快。
然而,正如ThorbjørnRavnAndersen所指出的,当使用JIT编译器时,字节码指令的数量并不多,因为字节码在执行之前将被转换为本机代码。即使存在性能差异,我也怀疑它是否可以衡量。
答案 2 :(得分:2)
我希望Java为这两个版本生成完全相同的字节码(可能是ifnull
bytecode),所以请使用更好的读取。
答案 3 :(得分:2)
不能说Java,但如果有,我会非常惊讶,它是不同的 在C#示例中,我写了
void Main()
{
object o = new object();
if(null == o)
Console.WriteLine("o is null");
// to force a reload of the registers
o = new object();
if(o == null)
Console.WriteLine("o is null");
}
生成的IL代码是
IL_0000: newobj System.Object..ctor
IL_0005: stloc.0 // o
IL_0006: ldloc.0 // o
IL_0007: brtrue.s IL_0013
IL_0009: ldstr "o is null"
IL_000E: call System.Console.WriteLine
IL_0013: newobj System.Object..ctor
IL_0018: stloc.0 // o
IL_0019: ldloc.0 // o
IL_001A: brtrue.s IL_0026
IL_001C: ldstr "o is null"
IL_0021: call System.Console.WriteLine
没有任何差异