2010-05-21 18 views
11

En general (o según su experiencia), ¿hay diferencia en el rendimiento entre los ciclos for y while?Rendimiento C++, para versus while

¿Qué sucede si están anidados doble/triplemente?

¿La vectorización (SSE) se ve afectada por la variante de bucle en los compiladores g ++ o Intel?

Gracias

+0

Me alegro de que está lisiado sólo temporalmente. Estoy permanentemente, y creo que me convierte en una especie de chiflado contrario. No solo estoy listo para usar, no puedo ingresar * en la caja. De todos modos, si haces una optimización seria mientras trato de mostrar cómo, puedes darte cuenta de que cosas como estas solo hacen la diferencia en la etapa final del ajuste del rendimiento. Buena suerte con sus estudios. –

+0

@Mike gracias. siento saber de ti Lo triste es que se dan por hecho muchas cosas y luego se da cuenta de lo importantes que son una vez que las pierdes :-( – Anycorn

Respuesta

13

Here es un buen documento sobre el tema.

+1

Creo que este párrafo lo resume bellamente: "* Optimización == importante. Pero a menudo: Código legible == más importante. * " Tiendo a favor de los bucles' for' para la iteración, ya que está claro dónde se inicializa y aumenta o disminuye su variable de bucle. – Johnsyweb

9

Cualquier compilador inteligente realmente no mostrará una diferencia entre ellos. Un lazo for es realmente solo azúcar sintáctico para una cierta forma de lazo while, de todos modos.

1

debe ser despreciable. un compilador de optimización debería hacer la distinción inexistente.

1

Esto es algo que se determina fácilmente mirando el desmontaje. Para la mayoría de los bucles, serán lo mismo suponiendo que hagas el mismo trabajo.

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

es lo mismo que

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

En cuanto a la jerarquización, que realmente depende de cómo se configure, pero mismas configuraciones debe ceder mismo código.

1

Debe haber una diferencia cero, pero verifique como he visto realmente mal, las versiones anteriores de GCC crean código diferente ARM/código de pulgar entre los dos. Uno optimizó una comparación a continuación después de un restar para establecer la bandera cero donde el otro no. Fue muy cojo

Anidar nuevamente no debería hacer ninguna diferencia. No estoy seguro de lo de SSE/Vectorización, pero de nuevo espero que no haya diferencia.

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

while3 - tiempo de CPU = 1,271