• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Kolejność ifów a wydajność programu

Object Storage Arubacloud
0 głosów
182 wizyt
pytanie zadane 15 stycznia 2016 w C i C++ przez Avernis Nałogowiec (27,400 p.)

Czy Kolejność ifów w programie ma znaczenie? Czy jeżeli ma się if sprawdzający manę, i if z przyciśnięciem przycisku na myszce to czy ich kolejność ma znaczenie? Przykład:

if(coś)
{
    if(drugie coś)
    {

    }
}

 

2 odpowiedzi

+2 głosów
odpowiedź 15 stycznia 2016 przez niezalogowany
edycja 15 stycznia 2016

Tak, to ma znaczenie.(przynajmniej pod kątem samego działania kodu).

@EDIT: Wyjaśnienie rozumowania

@Avernis wspomniał, że te warunki dotyczą się many i wciśnięcia klawisza, zatem można wnioskować że ten blok znajduje się wewnątrz pętli, zatem mamy coś w stylu:

// jakiś kod

if ( expr1)
{
 if(expr2)
 {
  // jakaś rekacja
 }
}

// jakiś kod

Załóżmy, że expr1 i expr2 to (zamiennie): sprawdzenie czy ilość many jest większa od zera oraz sprawdzenie czy klawisz jest wciśnięty.

Powyższy zapis kodu jest równoważny także z takim zapisem (ponieważ pomiędzy blokami if(expr1) i if(expr2) nie ma wspólnych instrukcji):

if(expr1 && expr2)

Jak widzimy całość się sprowadziła do prostego wyrażenia. pytanie brzmi: "Czy && jest relacją zwrotną (czyli czy expr1 && expr2 <=> expr2 && expr1)?" Otóż nie do końca, wiemy że wynik (efekt) będzie identyczny, ale istnieje pewna bardzo istotna różnica: jeżeli w expr1 && expr2, expr1 jest fałszywe, to expr2 nie zostanie wykonane/sprawdzone! (pisałem o tym tutaj: http://szymonsiarkiewicz.pl/artykuly/programowanie/cc-wszystko-co-chcielibyscie-wiedziec-ale-boicie-sie-zapytac/ )

Czyli w przypadku operacji && w pierwszej kolejności bardziej opłaca się sprawdzać na początku te warunki, które mają większa prawdopodobieństwo że będą fałszywe.

Wracając do naszego przykładu bardziej opłaca się najpierw sprawdzić, czy przycisk myszki jest wciśnięty, a dopiero później należy sprawdzić czy ilość many jest wystarczająca, dzięki temu zaoszczędzamy jedno porównanie (i prawdopodobnie jeden skok, zależy od kompilatora), w przypadku pętli która wykonuje się setki razy na sekundę potrafi to zrobić sporą różnicę.

0 głosów
odpowiedź 15 stycznia 2016 przez Patrycjerz Mędrzec (192,320 p.)
Nie, instrukcje są wykonywane tak samo, niezależnie od kolejności.
komentarz 15 stycznia 2016 przez niezalogowany
No nie do końca, ten przykład jest zbyt ogólny aby wykazać konkretne różnice, ale kod maszynowy będzie wyglądał inaczej. Niekoniecznie będzie to widoczna różna dla usera, ale mimo wszystko.
komentarz 15 stycznia 2016 przez Patrycjerz Mędrzec (192,320 p.)
Tak, kod będzie wyglądał inaczej, ale instrukcja warunkowa jest jedną z podstawowych operacji procesora, więc w tej materii nie sądzę, aby cokolwiek się zmieniło (poza kolejnością).
komentarz 15 stycznia 2016 przez Avernis Nałogowiec (27,400 p.)
np. mam ifa z ilością many i jak dam w niego odliczanie, to nie będzie wykonywane odliczanie, do puki nie mam many,  więc będzie optymalniej?
komentarz 15 stycznia 2016 przez niezalogowany

instrukcja warunkowa jest jedną z podstawowych operacji procesora, więc w tej materii nie sądzę, aby cokolwiek się zmieniło

Jest różnica jeżeli procesor będzie musiał wykonywać instrukcję skoku 2mln razy na sekundę a 4 mln, przykład podam za chwilę (10-40min)

komentarz 15 stycznia 2016 przez Patrycjerz Mędrzec (192,320 p.)

Czy chodzi ci o np. taki kod?

if((warunek1 || warunek2 || warunek3) && warunek4 || (warunek5 || !warunek6))
{
	if(warunek7)
	{
		//...
	}
}

Jeśli tak, to tutaj rzeczywiście zamiana warunków byłaby konieczna (mniej porównań, jeśli drugi warunek nie będzie zawsze spełniony).

komentarz 15 stycznia 2016 przez niezalogowany
Nie. Dodałem wyjaśnienie w swojej odpowiedzi.
komentarz 15 stycznia 2016 przez Patrycjerz Mędrzec (192,320 p.)

@Szymon Siarkiewicz Właśnie chodziło mi o to samo, co napisałeś w swojej odpowiedzi - po prostu nie wyraziłem tego zbyt zrozumiale.

Podobne pytania

0 głosów
1 odpowiedź 233 wizyt
pytanie zadane 3 stycznia 2016 w C i C++ przez Konrad Nabożny Stary wyjadacz (13,460 p.)
0 głosów
1 odpowiedź 268 wizyt
pytanie zadane 23 października 2017 w C i C++ przez Badzonor Obywatel (1,410 p.)
0 głosów
1 odpowiedź 110 wizyt

92,618 zapytań

141,467 odpowiedzi

319,785 komentarzy

62,001 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...