2

if (null == myObject)Javaと.Netの両方で、最初にnullを使用する方が、最初にオブジェクトを使用するよりもパフォーマンスが高いと聞いています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ました。)

オブジェクト参照を最初に配置すると2つの命令になり、null最初の結果を3つの命令に配置します。その上で、より速いif (myObject == null) かもしれません。

ただし、ThorbjørnRavn Andersenが指摘しているように、JITコンパイラを使用する場合、バイトコードは実行前にネイティブコードに変換されるため、バイトコード命令の数はそれほど意味がありません。そして、たとえパフォーマンスの違いがあったとしても、それが測定可能であるとは思えません。

于 2013-03-14T22:09:12.023 に答える
2

ifnullJavaは両方のバージョンでまったく同じバイトコード(おそらくバイトコード)を生成することを期待しているので、読みやすい方を使用してください。

于 2013-03-14T21:52:10.670 に答える
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 に答える