在 Java 和 .Net 中,我听说使用 null firstif (null == myObject)
比使用 object first 更高效if (myObject == null)
。虽然我认为这可能是真的,但我不确定并且想从 SO 用户那里知道。就个人而言,我认为如果先引用对象会更好读,但如果先使用 null 有任何性能提升,我会选择它。
问问题
300 次
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 能够为两个版本生成完全相同的字节码(可能是ifnull
bytecode),因此请使用对您来说更好的读取方式。
于 2013-03-14T21:52:10.670 回答