Предположим, что у меня есть оператор 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
Ответ 2
Из руководство по стилю Chromium:
Не используйте else после возврата:
# Bad
if (foo)
return 1
else
return 2
# Good
if (foo)
return 1
return 2
return 1 if foo else 2
Ответ 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, предпочитая разбить функцию на несколько подфункций, чтобы избежать этого, если это необходимо. Я вообще не рассматриваю вопрос об эффективности, поскольку это имеет значение для эффективности кодирования (т.е. Написания кода без ошибок).