2010-05-21 2 views
11

In generale (o dalla tua esperienza), c'è differenza di prestazioni tra cicli for e while?Prestazioni C++, per contro mentre

Cosa succede se sono doppiamente/triplicati?

La vettorizzazione (SSE) è influenzata dalla variante di loop nei compilatori g ++ o Intel?

si

+0

Sono contento che stai solo temporaneamente paralizzato. Sono permanentemente, e penso che mi faccia un po 'contrariata. Non sono solo pronto, non riesco a ottenere * in * la scatola. Ad ogni modo, se fai un'ottimizzazione seria mentre cerco di mostrare come, puoi capire che cose come questa fanno la differenza solo nella fase finale della messa a punto delle prestazioni. Buona fortuna con i tuoi studi. –

+0

@Mike grazie. mi dispiace sentire di te la cosa triste è una che dà per scontate molte cose e poi comprende quanto siano importanti una volta che le perdi :-( – Anycorn

risposta

13

Here è un bel documento sull'argomento.

+1

Penso che questo paragrafo riassuma tutto splendidamente: "Ottimizzazione == importante, ma spesso: codice leggibile == altro importante. * " Tendo a privilegiare i cicli' for' per l'iterazione poiché è chiaro dove viene inizializzata, incrementata o decrementata la variabile del ciclo. – Johnsyweb

9

qualsiasi compilatore intelligente Grazie non mostrerà davvero la differenza tra di loro. Un ciclo for è in realtà solo zucchero sintattico per una determinata forma del ciclo while, comunque.

1

dovrebbe essere trascurabile. un compilatore ottimizzante dovrebbe rendere la distinzione inesistente.

1

Questa è una cosa facilmente accertata guardando al disassemblaggio. Per la maggior parte dei loop, saranno uguali assumendo che tu faccia lo stesso lavoro.

int i = 0; 
while (i < 10) 
    ++i; 

è lo stesso di

for (int i = 0; i < 10; ++i) 
    ; 

quanto per la nidificazione, in realtà dipende da come lo si configura, ma stesse configurazioni dovrebbe produrre lo stesso codice.

1

Dovrebbe essere la differenza zero, ma verificare come ho visto davvero pessimo, versioni precedenti di GCC creare codice ARM/Thumb codice diverso tra i due. Uno ha ottimizzato un confronto dopo una sottrazione per impostare il flag zero dove l'altro no. Era molto debole.

L'annidamento non dovrebbe fare alcuna differenza. Non sono sicuro su materiale SSE/Vectorization, ma di nuovo mi aspetto che non ci sia differenza.

0

VS2015, Intel Xeon CPU

long long n = 1000000000; 
int *v = new int[n]; 
int *v1 = new int[2*n]; 

start = clock(); 
for (long long i = 0, j=0; i < n; i++, j+=2) 
    v[i] = v1[j]; 
end = clock(); 
std::cout << "for1 - CPU time = " << (double)(end - start)/CLOCKS_PER_SEC << std::endl; 

p = v; pe = p + n; p1 = v1; 
start = clock(); 
while (p < pe) 
{ 
    *p++ = *p1; 
    p1 += 2; 
} 
end = clock(); 
std::cout << "while3 - CPU time = " << (double)(end - start)/CLOCKS_PER_SEC << std::endl; 

for1 - tempo di CPU = 4,055

while3 - tempo di CPU = 1.271