Как в Java, так и в .Net я слышал, что использование null first if (null == myObject)
более производительно, чем использование объекта first if (myObject == null)
. Хотя я думаю, что это, вероятно, правда, я не уверен и хотел бы знать от пользователей SO. Лично я считаю, что будет лучше, если на объект будет сделана ссылка в первую очередь, но если есть какой-либо выигрыш в производительности за счет использования сначала null, я выберу это вместо этого.
Что быстрее: null == myObject или myObject == null?
Ответы (4)
Они точно такие же. Если бы была разница, любой компилятор сделал бы подкачку, так как нет абсолютно никакой функциональной разницы.
Удивительно, но в 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)
может быть быстрее.
Однако, как указывает Торбьёрн Равн Андерсен, при использовании JIT-компилятора количество инструкций байт-кода не имеет большого значения, поскольку байт-код в любом случае будет преобразован в собственный код перед выполнением. И даже если есть разница в производительности, я сомневаюсь, что ее можно будет измерить.
+
, чем с StringBuilder
.
- person Bart; 15.03.2013
==
сравнивает ссылки на объекты, аналогично указателям в других языках. Фактически он не оценивает ценность объекта. Кроме того, сам объект не может быть нулевым, только переменная (которая может указывать на объект) может быть нулевой.
- person matts; 15.03.2013
==
не перегружен для сравнения содержимого объектов на предмет равенства. Для этого нужно использовать метод equals
. При использовании с двумя отдельными объектами ==
оценивается как false
, даже если они имеют одинаковое содержимое. Например, new String("test") == new String("test")
должно оцениваться как false
, хотя new String("test").equals(new String("test"))
будет оцениваться как true
. Не уверен, что это ответ на ваш вопрос
- person matts; 15.03.2013
if (myObject == null)
, будет ли он сначала читать весь объект, а затем выполнять нулевую проверку? вместо того, чтобы if (null = myObject)
знать, что ему просто нужно знать, является ли он нулевым, и закоротить чтение объекта, как только он поймет, что он не равен нулю.
- person johntrepreneur; 15.03.2013
null
- это константа, и я бы предположил, что, поскольку многие движки JavaScript в наши дни также используют JIT, они оптимизировали бы полный сравнение объектов.
- person matts; 15.03.2013
Я ожидал, что Java будет генерировать один и тот же байт-код для обеих версий (возможно, ifnull
байт-код), поэтому используйте то, что вам больше нравится.
Не могу сказать о 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
ВООБЩЕ НЕТ РАЗНИЦЫ