if (null == myObject)
Javaと.Netの両方で、最初にnullを使用する方が、最初にオブジェクトを使用するよりもパフォーマンスが高いと聞いていますif (myObject == null)
。これはおそらく本当だと思いますが、確かではないので、SOユーザーから知りたいと思います。個人的には、オブジェクトを最初に参照した方が読みやすいと思いますが、最初にnullを使用することでパフォーマンスが向上する場合は、代わりにそれを選択します。
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
ifnull
Javaは両方のバージョンでまったく同じバイトコード(おそらくバイトコード)を生成することを期待しているので、読みやすい方を使用してください。
于 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 に答える