2

在 Java 和 .Net 中,我听说使用 null firstif (null == myObject)比使用 object first 更高效if (myObject == null)。虽然我认为这可能是真的,但我不确定并且想从 SO 用户那里知道。就个人而言,我认为如果先引用对象会更好读,但如果先使用 null 有任何性能提升,我会选择它。

4

4 回答 4

7

它们完全一样。如果有差异,任何编译器都会进行交换,因为绝对没有功能差异。

于 2013-03-14T21:51:56.877 回答
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ørn Ravn Andersen 所指出的,当使用 JIT 编译器时,字节码指令的数量并没有多大意义,因为无论如何字节码都会在执行之前转换为本地代码。即使存在性能差异,我也怀疑它是否可以衡量。

于 2013-03-14T22:09:12.023 回答
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

完全没有区别

于 2013-03-14T21:58:02.427 回答
2

我希望 Java 能够为两个版本生成完全相同的字节码(可能是ifnullbytecode),因此请使用对您来说更好的读取方式。

于 2013-03-14T21:52:10.670 回答