Bardziej efektywne jest użycie if-return - return lub if-else-return?

Załóżmy, że mam if twierdzenie z return. Z punktu widzenia wydajności, czy powinienem używać

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

Lub

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

Czy powinienem preferować jeden lub drugi, gdy używam języka skompilowanego (C) lub skryptowego (Python)?

Author: Jorge Leitão, 2012-02-08

7 answers

Ponieważ polecenie return kończy wykonywanie bieżącej funkcji, obie formy są równoważne(chociaż druga jest prawdopodobnie bardziej czytelna niż pierwsza).

Wydajność obu form jest porównywalna, Podstawowy kod maszynowy musi wykonać skok, jeśli warunek if i tak jest fałszywy.

Zauważ, że Python obsługuje składnię, która pozwala na użycie tylko jednej instrukcji return w Twoim przypadku:

return A+1 if A > B else A-1
 116
Author: Frédéric Hamidi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-08 10:25:56

From Chromium ' s style guide:

Nie używaj else po powrocie:

# Bad
if (foo)
  return 1
else
  return 2

# Good
if (foo)
  return 1
return 2

return 1 if foo else 2
 22
Author: skeller88,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-18 20:44:27

W przypadku jakiegokolwiek sensownego kompilatora, nie powinieneś zauważać różnicy; powinny one być skompilowane do identycznego kodu maszynowego, ponieważ są równoważne.

 3
Author: Oliver Charlesworth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-08 10:29:16

Odnośnie stylu kodowania:

Większość standardów kodowania bez względu na język zakazuje wielu zwrotów z jednej funkcji jako złej praktyki.

(chociaż osobiście powiedziałbym, że jest kilka przypadków, w których wiele zwrotów ma sens: parsery protokołu tekstowego/danych, funkcje z rozbudowaną obsługą błędów itp.)

Zgodność ze wszystkimi branżowymi standardami kodowania jest taka, że wyrażenie powinno być zapisane jako:

int result;

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

Regarding efektywność:

Powyższy przykład i dwa przykłady w pytaniu są całkowicie równoważne pod względem wydajności. Kod maszynowy we wszystkich tych przypadkach musi porównywać A > B, następnie rozgałęziać się do obliczenia A+1 lub A-1, a następnie przechowywać wynik w rejestrze CPU lub na stosie.

EDIT:

Źródła:

  • MISRA-C: 2004 przepis 14.7, który z kolei cytuje...:
  • IEC 61508-3. Część 3, tabela B. 9.
  • IEC 61508-7. C. 2. 9.
 3
Author: Lundin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-11 12:45:44

Wersja A jest prostsza i dlatego bym z niej skorzystał.

A po włączeniu wszystkich ostrzeżeń kompilatora w Javie otrzymasz ostrzeżenie o drugiej wersji, ponieważ jest to unnecesarry i zwiększa złożoność kodu.

 1
Author: juergen d,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-08 10:23:51

Zawsze używam:

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

Ponieważ przestrzega zarówno dobrej konwencji posiadania pojedynczej instrukcji powrotu jako ostatniej instrukcji w funkcji (jak już wspomniano), jak i dobrego paradygmatu programowania funkcyjnego, polegającego na unikaniu imperatywnych wyników pośrednich w stylu. Dla bardziej złożonych funkcji wracam do użycia imperatywnej zmiennej stylu o nazwie rval. Nigdy nie używam wielu poleceń return, preferując podział funkcji na wiele podfunkcji, aby tego uniknąć, jeśli to konieczne. Tak. nie rozwaĺľaj w ogĂłle kwestii efektywnoĺ" ci, jako sprawnoĹ "Ä ‡ kodowania (tj. pisania kodu bez bĹ' Ä ™ dnego), ktĂłra mi siÄ ™ liczy.

 0
Author: Stephen Ellwood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-16 16:25:27

Wiem, że pytanie jest oznaczone Pythonem, ale wspomina o językach dynamicznych, więc pomyślałem, że powinienem wspomnieć, że w Rubim Instrukcja if faktycznie ma typ powrotu, więc możesz zrobić coś w stylu

def foo
  rv = if (A > B)
         A+1
       else
         A-1
       end
  return rv 
end

Lub dlatego, że ma również ukryty zwrot po prostu

def foo 
  if (A>B)
    A+1
  else 
    A-1
  end
end

Który dość ładnie rozwiązuje problem stylu polegający na braku wielu zwrotów.

 0
Author: Jamie Cook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-01 12:59:12