logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

C - Zagnieżdżone if czy warunek złożony: optymalizacja kodu w C

luki05 13 Mar 2015 21:16 1524 7
REKLAMA
  • #1 14527015
    luki05
    Poziom 11  
    Posty: 88
    Ocena: 4
    Nurtuje mnie jak lepiej pisać warunki złożone.

    Czy np:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Czy

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Nie wiem czy dobrze to rozumiem, ale wydaje mi się, że pierwszy przypadek jest mniej optymalny ponieważ najpierw jest sprawdzany czy a==4 potem czy b==2 i dopiero na końcu czy koniunkcja jest prawdziwa i ewentualnie wykonywany kod.

    W drugim przypadku już po sprawdzeniu czy a==4 jeśli nie jest to wykonywana jest dalsza część programu więc procesor (mikrokontroler) ma mniej do roboty....
    Dobrze to rozumiem??
  • REKLAMA
  • #2 14527099
    Stefan_2000
    Poziom 20  
    Posty: 349
    Pomógł: 36
    Ocena: 39
    W większości języków i jedno, i drugie zachowa się dokładnie tak samo - poczytaj o ang. lazy evaluation, ewaluacja leniwa.
  • REKLAMA
  • #3 14527105
    Krzysztof Gustaw
    Poziom 23  
    Posty: 392
    Pomógł: 76
    Ocena: 32
    Witam!
    Jak wspomniał kolega STEFAN_2000, zachowają się tak samo.
    Moim zdaniem sposób pierwszy jest lepszy bo zapis jest bardziej przejrzysty.
    jeśli chodzi o złożone wyrażenia logiczne zasada jest następująca:
    Poszczególne człony są obliczane od strony lewej do prawej i jeśli wynik jest już ustalony do dalsze przetwarzanie jest wstrzymane. Wniosek - kolejność wyrażeń logicznych w instrukcji warunkowej (jak też w np pętlach) nie jest obojętna.
    Przykład:
    czytamy z jakiegoś pliku i możemy przeczytać ograniczoną liczbę znaków. Pętla ma zakończyć się w przypadku zapełnienia bufora lub przeczytania wszystkich znaków z pliku.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Jeśli pierwszy człon warunku (a < LENGTH) jest prawdziwy, to badany jest drugi człon tego warunku, w przeciwnym wypadku pętla kończy działanie i co najważniejsze nie jest czytany znak z pliku
  • #4 14527190
    yogi009
    Poziom 43  
    Posty: 14697
    Pomógł: 848
    Ocena: 2650
    W bardziej złożonym zapisie pierwszy kod będzie bardziej przejrzysty, funkcjonalnie efekt ten sam.
  • REKLAMA
  • #5 14527241
    luki05
    Poziom 11  
    Posty: 88
    Ocena: 4
    Wiem że pierwszy przypadek jest bardziej przejrzysty i tak zazwyczaj piszę, tylko właśnie zastanowiło mnie czy nie obciąża bardziej CPU.

    Nie wiedziałem że jest coś takiego jak "lazy evaluation"...
  • #6 14527350
    yogi009
    Poziom 43  
    Posty: 14697
    Pomógł: 848
    Ocena: 2650
    Zostaw to zadanie prekomplilatorowi, daj mu szansę na wykonanie optymalizacji.
  • REKLAMA
  • #7 14531009
    p.kaczmarek2
    Moderator Smart Home
    Posty: 14699
    Pomógł: 656
    Ocena: 12734
    Pierwszy przypadek jest bardziej ryzykowny ze względu na kolejność operatorów, jak już to rób tak jak w pierwszym ale z nawiasami.
    Pomogłem? Kup mi kawę.
  • #8 14534867
    kinggustav
    Poziom 27  
    Posty: 797
    Pomógł: 93
    Ocena: 93
    Proponuję inne rozumowanie: to co napiszesz jest najpierw dla człowieka a potem dla kompilatora. Dla kompilatora jest obojętne (w tym dokładnie przypadku), ale dla człowieka sama obecność drugiego ifa już coś mówi. Niezorientowany będzie musiał sie domyślić po co jest ten drugi if i niektórzy sie zdziwią ze wogóle jest. Czyli jak jest to uzasadnione (np. jest tam jakies else do jednego ifa) to rozbijamy na dwa ify, jeżeli tylko prosty warunek to napiszmy to w jednej linii i nie myślmy o tym wiecej.

Podsumowanie tematu

✨ Dyskusja dotyczy optymalizacji warunków złożonych w języku C, porównując dwa podejścia: zagnieżdżone instrukcje if oraz pojedyncze wyrażenie z operatorem logicznym AND. Uczestnicy podkreślają, że oba podejścia w większości przypadków zachowują się identycznie dzięki mechanizmowi lazy evaluation, co oznacza, że dalsze obliczenia są wstrzymywane, gdy wynik jest już ustalony. Wskazano, że pierwszy sposób jest bardziej przejrzysty, ale może być mniej optymalny w kontekście obciążenia CPU. Zasugerowano, aby programista pisał kod z myślą o czytelności dla ludzi, a nie tylko dla kompilatora, a także aby stosować nawiasy dla zwiększenia bezpieczeństwa w przypadku złożonych warunków.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA