2014-10-06 3 views
1

Есть ли существенная разница в оптимизации между этими двумя кодами (в Java и/или C++, в настоящее время, даже если я предполагаю, что это то же самое на всех языках)? Или это просто вопрос читаемости кода?Использовать несколько операторов возврата

int foo(...) { 
    if (cond) { 
     if (otherCondA) 
      return 1; 
     if (otherCondB) 
      return 2; 
     return 3; 
    } 
    int temp = /* context and/or param-dependent */; 
    if (otherCondA) 
     return 4 * temp; 
    if (otherCondB) 
     return 4/temp; 
    return 4 % temp; 
} 

и

int foo(...) { 
    int value = 0; 
    if (cond) { 
     if (otherCondA) 
      value = 1; 
     else if (otherCondB) 
      value = 2; 
     else value = 3; 
    } 
    else { 
     int temp = /* context and/or param-dependent */; 
     if (otherCondA) 
      value = 4 * temp; 
     else if (otherCondB) 
      value = 4/temp; 
     else 
      value = 4 % temp; 
    } 
    return value; 
} 

Первый один короче, избежать многочисленных imbrications из еще заявления и сэкономить одну переменную (или, по крайней мере, кажется, сделать это), но я не уверен, что это на самом деле что-то ...

+0

Вы не уверены, что это хорошая идея ... почему? У вас есть какие-либо разумные причины или вы просто просыпались этим утром, чувствуя это? Вы пытались проверить сгенерированный код или использовать инструменты профилирования? –

+0

Многие люди выступают за один «возврат», потому что считают, что код легче прояснить. Даже когда я следую этому совету, я также разрешаю ранние возвращения в начале функции, когда предварительные условия терпят неудачу. –

+0

После нескольких тестов компилятор может оптимизировать только несколько операторов возврата, о которых говорит MarkRansom. В середине функции оптимизация очень плохая. –

ответ

1

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

Многократное возвращение заявление является более эффективным при «нормальной» компиляции , но с флагом -O_, изменение баланса:

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

0

Конечно, множественное возвращение приемлемо. Потому что вы можете остановить программу, как только функция закончена

Смежные вопросы