Это ситуация, с которой я часто сталкиваюсь, как неопытный программист, и меня интересует, в частности, для моего амбициозного, требовательного к скорости проекта, который я пытаюсь оптимизировать.Для основных C-подобных языков (C, objC, C ++, Java, C # и т. Д.) И их обычных компиляторов будут ли эти две функции работать столь же эффективно? Есть ли какая-нибудь разница в скомпилированном коде?
void foo1(bool flag)
{
if (flag)
{
//Do stuff
return;
}
//Do different stuff
}
void foo2(bool flag)
{
if (flag)
{
//Do stuff
}
else
{
//Do different stuff
}
}
В принципе, есть ли когда-либо прямой бонус / штраф за эффективность, когда прерывают
или возвращают
раньше? Как задействован стековый фрейм? Есть ли оптимизированные особые случаи? Существуют ли какие-либо факторы (например, встраивание или размер «Делать что-нибудь»), которые могут существенно повлиять на это?
Я всегда сторонник улучшения разборчивости по сравнению с незначительными оптимизациями (я часто вижу foo1 с проверкой параметров), но это возникает так часто, что я хотел бы раз и навсегда забыть обо всех тревогах.
И я знаю о ловушках преждевременной оптимизации ... ох, это неприятные воспоминания.
РЕДАКТИРОВАТЬ: Я принял ответ, но ответ EJP довольно лаконично объясняет, почему использование возврата
практически ничтожно (в сборке return
создает «ветвь» для конец функции, что происходит очень быстро. Ветка изменяет регистр ПК, а также может повлиять на кэш и конвейер, что довольно незначительно.) В этом случае, в частности, это буквально не имеет значения, потому что оба параметра if / else
и return
создают одну и ту же ветвь до конца функции.