2009-07-07 4 views
7

Ho una semplice domanda che mi sto ponendo soprattutto per la mia curiosità.Differenza di prestazione nella condizione di loop?

Quali sono le differenze tra queste due righe di codice? (In C++)

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

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

La scelta delle condizioni è del tutto arbitraria, sono solo interessato alla differenza tra, e & &.

Non sono un principiante per la codifica con qualsiasi mezzo, ma non mi sono mai preoccupato con l'operatore virgola.

Ci sono differenze di prestazioni/comportamento o è puramente estetico?

Un'ultima nota, so che ci sono pesci da prestazione più grandi da friggere rispetto a un operatore condizionale, ma sono solo curioso. Concedimi.

Modifica Grazie per le vostre risposte.

Si scopre che il codice che ha richiesto questa domanda ha utilizzato male l'operatore virgola nel modo in cui ho descritto. Mi sono chiesto quale fosse la differenza e perché non si trattasse di un operatore & &, ma è stato appena scritto in modo errato. Non pensavo che ci fosse qualcosa di sbagliato in questo, perché funzionava bene. Grazie per avermi raddrizzato.

+0

Perché sei preoccupato per le prestazioni? Nel tempo necessario per ottenere una risposta a questa domanda, i 9 nanosecondi che avresti salvato usando l'una o l'altra notazione sarebbero già andati persi. "L'ottimizzazione prematura è la radice di tutti i mali ..." – Juliet

+17

Non disse che era preoccupato - solo curioso. Vorrei davvero che la gente smettesse di sventolare il flag "ottimizzazione prematura" ogni volta che qualcuno "vuole solo sapere". La curiosità è una * cosa buona *. –

+5

Mi chiedo quanto tempo si salverebbe se SO implementasse un filtro che, ogni volta che qualcuno menziona le parole "performance" o "più veloce" in una domanda, semplicemente auto-pubblica un commento dicendo "non ti è permesso di pensare a che, cittadino, ora torni al lavoro ";-) –

risposta

10

Anche se sembra che,

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

e

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

non sono equivalenti.

Ecco la prova.

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

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

Risultato:

5 

Il che significa che il momento di determinare quando il loop uscirà userà N > 0. Se N = 10, ciò significa che sarà sempre true e il ciclo non uscirà mai.

Eseguire questo e vedere la prova.

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 

Se N è una costante o variabile che non modifichi all'interno del ciclo allora si può solo rimuovere il controllo N > 0 controllando una volta prima, cioè

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

Non so perché nessuno ha votato. Mi piace una risposta ben ponderata e dettagliata quando chiedo una spiegazione. Grazie – CodeFusionMobile

+3

Non lo voterei perché non indica chiaramente la differenza e cerca di determinare il significato tramite esperimento, piuttosto che guardare lo standard o qualsiasi documentazione. –

+0

Mi piacciono gli esempi e gli esperimenti personalmente. La risposta di RichieHindle è stata breve e accurata, ma non molto descrittiva, né ha risposto alla mia domanda qual è la differenza effettiva. Anche se questa risposta non ha dettagliato la ragione del problema, in realtà ha risposto alla domanda. – CodeFusionMobile

33

Utilizzando una virgola del genere sarà semplicemente scartare la prima condizione.

L'operatore virgola significa "esegui queste istruzioni in questo ordine e prendi il valore dell'ultima".

+0

come in esso totalmente ignora e non esegue il controllo? – Victor

+2

Il valore di "' i < N, N > 0' "è uguale al valore di" 'N> 0'". – ephemient

+1

@Victor: confronta i e N, scarta il risultato, quindi confronta N e 0 e utilizza il risultato per decidere se continuare il ciclo. Nel codice ottimizzato, probabilmente non si preoccuperà di confrontare I e N. – RichieHindle