2010-05-21 12 views
11

En général (ou d'après votre expérience), y a-t-il une différence de performance entre les boucles for et while?Performance C++, pour versus while

Et s'ils sont imbriqués deux fois/trois fois?

La vectorisation (SSE) est-elle affectée par une variante de boucle dans les compilateurs g ++ ou Intel?

Merci

+0

Je suis heureux que vous êtes seulement temporairement estropié. Je suis en permanence, et je pense que cela me rend un peu contrariante. Je ne suis pas seulement out-of-the-box, je ne peux pas * dans * la boîte. Quoi qu'il en soit, si vous faites une optimisation sérieuse pendant que j'essaie de montrer comment, vous pouvez réaliser que des choses comme celle-ci ne font la différence qu'à la toute fin du réglage des performances. Bonne chance avec vos études. –

+0

@ Merci Mike. désolé d'entendre parler de vous. Chose triste, on prend beaucoup de choses pour acquis, puis se rend compte combien ils sont importants une fois que vous les perdez :-( – Anycorn

Répondre

13

Here est un joli papier sur le sujet.

+1

Je pense que ce paragraphe résume tout magnifiquement: "* Optimisation == important. Mais souvent: Code lisible == plus Je préfère les boucles 'for' pour l'itération car il est clair où votre variable de boucle est initialisée et incrémentée ou décrémentée. – Johnsyweb

9

Tout compilateur intelligente ne montrera pas vraiment une différence entre eux. Une boucle for est vraiment juste du sucre syntaxique pour une certaine forme de boucle while, de toute façon.

1

il devrait être négligeable. un compilateur d'optimisation devrait faire la distinction inexistante.

1

Ceci est quelque chose de facile à déterminer en regardant le désassemblage. Pour la plupart des boucles, elles seront les mêmes en supposant que vous faites le même travail.

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

est le même que

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

En ce qui concerne l'imbrication, cela dépend vraiment de la façon dont vous configurez mais même les configurations devrait donner même code.

1

Devrait être la différence zéro, mais vérifiez comme j'ai vu vraiment merdique, les versions plus anciennes de GCC créent un code ARM/Thumb différent entre les deux. Un optimisé loin un comparer après une soustraction pour définir le drapeau zéro où l'autre n'a pas. Était très boiteux.

L'imbrication à nouveau ne devrait pas faire de différence. Je ne suis pas sûr sur SSE/Vectorisation, mais encore une fois, je m'attendrais à ce qu'il n'y ait aucune différence.

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 - temps CPU = 4,055

while3 - temps CPU = 1,271