Эффективнее использовать if-return-return или if-else-return?

Предположим, что у меня есть оператор if с return. С точки зрения эффективности, следует ли использовать

if(A > B):
    return A+1
return A-1

или

if(A > B):
    return A+1
else:
    return A-1

Должен ли я предпочесть тот или иной при использовании скомпилированного языка (C) или сценария (Python)?

Ответ 1

Поскольку оператор return завершает выполнение текущей функции, две формы эквивалентны (хотя вторая, возможно, более читаема, чем первая).

Эффективность обеих форм сопоставима, базовый машинный код должен выполнять скачок, если условие if в любом случае является ложным.

Обратите внимание, что Python поддерживает синтаксис, который позволяет использовать только один оператор return в вашем случае:

return A+1 if A > B else A-1

Ответ 3

С любым разумным компилятором вы не заметите разницы; они должны быть скомпилированы для идентичного машинного кода, поскольку они эквивалентны.

Ответ 4

Что касается стиля кодирования:

Большинство стандартов кодирования независимо от языка запрещают несколько операторов возврата из одной функции в качестве плохой практики.

(Хотя лично я бы сказал, что есть несколько случаев, когда несколько операторов возврата имеют смысл: синтаксические анализаторы текста/данных, функции с обширной обработкой ошибок и т.д.)

Консенсус всех стандартов отраслевого кодирования заключается в том, что выражение должно быть написано как:

int result;

if(A > B)
{
  result = A+1;
}
else
{
  result = A-1;
}
return result;

Относительно эффективности:

Приведенный выше пример и два примера в вопросе полностью эквивалентны с точки зрения эффективности. Машинный код во всех этих случаях должен сравнить A > B, затем перейти к вычислению A + 1 или A-1, а затем сохранить результат этого в регистре CPU или в стеке.

EDIT:

Источники:

  • Правило MISRA-C: 2004 14.7, которое, в свою очередь, цитирует...:
  • IEC 61508-3. Часть 3, таблица B.9.
  • IEC 61508-7. C.2.9.

Ответ 5

Версия A проще и почему я буду использовать ее.

И если вы включите все предупреждения компилятора в Java, вы получите предупреждение во второй версии, потому что оно не исправлено и вызывает сложность кода.

Ответ 6

Я всегда использовал бы:

return A+1 if (A > B) else A-1

Поскольку он подчиняется как хорошему соглашению о наличии единственного оператора возврата в качестве последнего утверждения в функции (как уже упоминалось), так и хорошей парадигме функционального программирования, избегающей промежуточных результатов императивного стиля. Для более сложных функций я возвращаюсь к использованию императивной переменной стиля, называемой rval. Я никогда не использую несколько операторов return, предпочитая разбить функцию на несколько подфункций, чтобы избежать этого, если это необходимо. Я вообще не рассматриваю вопрос об эффективности, поскольку это имеет значение для эффективности кодирования (т.е. Написания кода без ошибок).