2009-07-07 15 views
7

Mam proste pytanie, które przedstawiam głównie dla mojej ciekawości.Różnica w wydajności dla stanu pętli?

Jakie są różnice między tymi dwoma liniami kodu? (W C++)

for(int i = 0; i < N, N > 0; i++) 

for(int i = 0; i < N && N > 0; i++) 

Dobór warunków jest całkowicie arbitralna, jestem zainteresowany różnic między i & &.

Nie jestem początkującym w kodowaniu w żaden sposób, ale nigdy nie zawracałem sobie głowy operatorem przecinka.

Czy różnice w wydajności/zachowaniu są czysto estetyczne?

Jeszcze jedna uwaga, wiem, że są większe ryby do smażenia niż operator warunkowy, ale jestem po prostu ciekawy. Zanurz mnie.

Edytuj Dziękuję za odpowiedzi.

Okazuje się, że kod, który spowodował to pytanie, wykorzystał w niewłaściwy sposób operatora przecinka w sposób opisany przeze mnie. Zastanawiałem się, jaka jest różnica i dlaczego nie był to operator & &, ale został napisany niepoprawnie. Nie sądziłem, że coś jest nie tak z tym, ponieważ działało dobrze. Dziękuję za wyprostowanie mnie.

+0

Dlaczego martwi Cię wydajność? W czasie, który zajmuje uzyskanie odpowiedzi na to pytanie, 9 nanosekund, które zapisałeś przy użyciu jednej lub drugiej notacji, zostało już utracone. "Przedwczesna optymalizacja jest źródłem wszelkiego zła ..." – Juliet

+17

Nie powiedział, że się martwi - po prostu ciekawy. Naprawdę chciałbym, żeby ludzie przestali wymachiwać flagą "przedwczesnej optymalizacji" za każdym razem, gdy ktoś "po prostu chce wiedzieć". Ciekawość to * dobra rzecz *. –

+5

Zastanawiam się, ile czasu zostałoby zaoszczędzone, gdyby TAK zaimplementował filtr, który za każdym razem, gdy ktoś wymieniłby w pytaniu słowa "wydajność" lub "szybciej", po prostu automatycznie publikuje komentarz, "nie wolno ci myśleć o to, obywatel, teraz wracaj do pracy ";-) –

Odpowiedz

10

Chociaż wygląda na to,

for(int i = 0; i < N, N > 0; i++) 

i

for(int i = 0; i < N && N > 0; i++) 

nie są równoważne.

Oto dowód.

int main(int argc, char* argv[]) 
{ 
    int N = 10; 
    int i = 5; 

    int val = (N, i); 
    cout << val << endl; 
} 

Wynik:

5 

co oznacza, że ​​przy ustalaniu, kiedy pętla wyjdzie użyje N > 0. Jeśli N = 10, oznacza to, że zawsze będzie to prawda, a pętla nigdy nie zakończy pracy.

Uruchom to i zobacz dowód.

int main(int argc, char* argv[]) 
{ 
    int N = 10; 
    int i = 5; 

    for(int i = 0; i < N, N > 0; i++){ 
    cout << val << endl; 
    } 
} 

bash-2.05$ ./a.out     
0         
1         
2         
3         
4         
5         
6         
7         
8         
9         
10         
11         
... 
142 
143 
144 
145 
146 
147 
148 
^C 

Jeśli N jest stałą lub zmienną, która nie zmienia się wewnątrz pętli następnie można po prostu usunąć zaznaczenie N > 0 sprawdzając raz pierwszy, to znaczy

if (N > 0){ 
    for (int i = 0; i < N; i++) 
    ... 
} 
+0

Nie wiem, dlaczego nikt tego nie głosował. Lubię dobrze przemyślaną i szczegółową odpowiedź, kiedy proszę o wyjaśnienie. Dzięki – CodeFusionMobile

+3

Nie będę głosował, ponieważ nie wskazuje on wyraźnie różnicy i próbuje określić znaczenie eksperymentu, zamiast patrzeć na standard lub jakąkolwiek dokumentację. –

+0

Ja osobiście lubię przykłady i eksperymenty. Odpowiedź RichieHindle była krótka i dokładna, ale niezbyt opisowa, ani nie odpowiadała na moje pytanie, jaka jest rzeczywista różnica. Nawet jeśli ta odpowiedź nie wyjaśniałaby przyczyny problemu, faktycznie odpowiedział na pytanie. – CodeFusionMobile

33

Użycie takiego przecinka spowoduje po prostu odrzucenie pierwszego warunku.

Operator przecinka oznacza "wykonaj te instrukcje w tej kolejności i weź wartość ostatniego".

+0

jak w nim całkowicie ignoruje i nie wykonuje czeku? – Victor

+2

Wartość "' i < N, N > 0 "" jest taka sama, jak wartość "' N> 0 ". – ephemient

+1

@Victor: Porównuje on i N, odrzuca wynik, następnie porównuje N i 0 i używa wyniku, aby zdecydować, czy kontynuować pętlę. W zoptymalizowanym kodzie najprawdopodobniej nie przejmą się porównywaniem i N. – RichieHindle

Powiązane problemy