Имеет ли значение производительность, если есть "else" после первого "возврата"?
Теперь я видел два разных способа создания логического метода возврата:
bool Case1()
{
if (A)
return true;
else
return false;
}
bool Case2()
{
if (A)
return true;
return false;
}
Какой из них быстрее? Имеет ли смысл писать else
только для того, чтобы сохранить строку, сделать ее более ясной или есть незначительное увеличение производительности?
Ответы
Ответ 1
Нет.
Даже когда мы смотрим на их код IL
, они имеют одинаковый код IL
, поэтому между ними нет разницы в производительности. Используйте ту, которая более читаема для вас.
.method private hidebysig instance bool Case1() cil managed
{
// Code size 9 (0x9)
.maxstack 1
.locals init ([0] bool CS$1$0000,
[1] bool CS$4$0001)
IL_0000: nop
IL_0001: ldc.i4.0
IL_0002: stloc.1
IL_0003: ldc.i4.1
IL_0004: stloc.0
IL_0005: br.s IL_0007
IL_0007: ldloc.0
IL_0008: ret
} // end of method Program::Case1
Посмотрите на эти фрагменты кода для своих выступлений;
http://ideone.com/8Sc7Ho → Память: 33856 kB
http://ideone.com/MrnaAl → Память: 33808 kB
Итак, если вы используете их даже 10.000 раз, не о чем беспокоиться.
Ответ 2
Компилятор С# должен генерировать тот же IL для этих двух случаев, поэтому не должно быть разницы в производительности. Вы всегда можете просмотреть сгенерированный ИЛ, если вам интересно, что на самом деле происходит (попытка научить ловить рыбу).
IMHO, Case1
легче читать, что чего-то стоит. Мой второй выбор был бы return A;
(как упоминалось в некоторых других ответах). Если A
не является bool
, хотя есть неявное преобразование, которое может быть запутанным в некоторых случаях.
Я думаю, что читаемость должна побеждать, если вы не можете доказать с профилировщиком, что у вас есть проблема.
Ответ 3
Не будет (незначительной) разницы. С точки зрения кодирования вы действительно должны просто делать:
return A;
Но если предположить, что код был только для примера, я бы предложил:
bool Case3()
{
bool retValue;
if (A)
{
retValue = true;
}
else
{
retValue = false;
}
return retValue;
}
Таким образом, вы четко понимаете, что происходит, и какое значение нужно вернуть. Если вам нужно вернуться и изменить функциональность метода, это намного проще.
Ответ 4
Производительность одинакова. С точки зрения хорошей практики кодирования, предпочитайте последнюю, так что ясно, что функция всегда возвращает действительное значение.
Ответ 5
Они одинаковы.
Если A
является ложным, в обоих случаях произойдет переход к оператору return false
.