Java 哪个更快;null==myObject";或;myObject==null";?
在Java和.Net中,我听说先使用nullJava 哪个更快;null==myObject";或;myObject==null";?,java,.net,null,operator-precedence,control-structure,Java,.net,Null,Operator Precedence,Control Structure,在Java和.Net中,我听说先使用nullif(null==myObject)比先使用objectif(myObject==null)性能更好。虽然我认为这可能是真的,但我不确定,我想从这么多用户那里知道。就我个人而言,我认为如果首先引用对象会更好,但是如果先使用null会提高性能,我会选择它。它们完全一样。如果存在差异,任何编译器都会进行交换,因为绝对没有功能上的差异。我希望Java为两个版本(可能是)生成完全相同的字节码,所以请使用您认为更好的版本。不能说是Java,但如果存在差异,我会非
if(null==myObject)
比先使用objectif(myObject==null)
性能更好。虽然我认为这可能是真的,但我不确定,我想从这么多用户那里知道。就我个人而言,我认为如果首先引用对象会更好,但是如果先使用null会提高性能,我会选择它。它们完全一样。如果存在差异,任何编译器都会进行交换,因为绝对没有功能上的差异。我希望Java为两个版本(可能是)生成完全相同的字节码,所以请使用您认为更好的版本。不能说是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
毫无差别令人惊讶的是,它们在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)
(这是使用javac1.6.0\u24
编译的)
将对象引用放在第一位会产生两条指令,而将null
放在第一位会产生三条指令。在此基础上,if(myObject==null)
可能会更快
然而,正如Thorbjørn Ravn Andersen指出的那样,当使用JIT编译器时,字节码指令的数量并不重要,因为字节码在执行之前将被转换为本机代码。即使存在性能差异,我也怀疑它是否可以测量。如果存在差异,这种差异极不可能,这很重要。在Java中,如果你错放了=,它们都无法编译。@QuentinUK除非你比较布尔值,否则我现在明白了,这实际上只是C程序员如何编码以避免错误的结果,因为这种编码实践是由一位前C程序员向我建议的。@Thorbjørn Ravn Andersen在这种情况下,第一种方法可以用来避免意外错误错误,就像在C语言中常把常量放在左边一样。我知道它们在功能上是一样的,但我对性能很好奇。如果JVM使用JIT编译器,你不能从字节码的数量决定执行速度。提到字节码时+1。与使用
+
运算符然后使用StringBuilder
@Thorbjørnravandersen进行字符串连接效率较低的原因相同,这一点很好。“我会调整我的答案。”马特斯你说,“即使有绩效差异,我也怀疑它是否可以测量。”。如果较大的对象计算整个对象而不是较小的对象只是为了查看其是否为空,那么它不会花费更长的时间吗?我认为如果它知道它只需要看看它是否为空,它就会短路而无法检查整个对象。@johntrepreneur我不是专家,但我不认为对象的大小在这里有什么区别。与对象一起使用时,=
运算符比较对象引用,类似于其他语言中的指针。它实际上并不计算对象的值。此外,对象本身不能为null,只有变量(可以指向对象)可以为null。