哪个更快:“null == myObject”或“myObject == null”?

时间:2013-03-14 21:50:40

标签: java .net null operator-precedence control-structure

在Java和.Net中,我听说首先使用null if (null == myObject)比首先使用对象if (myObject == null)更高效。虽然我认为这可能是真的,但我不确定并希望了解SO用户。就个人而言,我认为如果首先引用该对象会更好,但如果首先使用null会有任何性能提升,我会选择它。

4 个答案:

答案 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

没有任何差异