Эффективность преждевременного возврата в функции

Это ситуация, с которой я часто сталкиваюсь, как неопытный программист, и меня интересует, в частности, для моего амбициозного, требовательного к скорости проекта, который я пытаюсь оптимизировать.Для основных 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 создают одну и ту же ветвь до конца функции.

96
задан Philip 28 October 2011 в 18:42
поделиться