Tuesday, April 26, 2011

++i vs i++

Saludos.

    La semana pasada me quedé con una duda cuando revisábamos el código de un socket hecho en Java, dado que en un ciclo había un "pre-incremento", i.e., un ++i en lugar del clásico i++.
Efectivamente el ciclo se comporta exactamente igual,  e.g., si mandamos a imprimir los primeros 10 números naturales encontramos que no importa la notación utilizada. Sin embargo, también afecta del desempeño del ciclo y desde entonces traigo la espina con eso, bueno pues hoy tuve un rato libre e hice una prueba:




Tuve que utilizar el tipo long para que la diferencia entre el inicio y el término de cada ciclo sea evidente sin necesidad de realizar ningún otro proceso dentro que entorpezca la prueba.

La salida de dicho código es:


Dónde se puede apreciar que son exactamente dos segundos de diferencia en ambos casos utilizando 1,000,000,000 de iteraciones.

Entonces dónde está la ventaja de utilizar  ++i ?

Una explicación podría ser:

En la mayoría de los casos la VM de Java realiza un proceso de optimización en tiempo de ejecución, es por eso que la diferencia no es tan notoria, pero si se utliza un lenguaje nativo com C entonces se aprecia que cuando se usa la sentencia i++ el compilador genera en el ensamblado algo como lo siguiente

var temp = 0;
temp = i;
i = temp + 1;
return temp;

Esto implica que tuvo que generar una variable temporal donde almacenará el valor actual de la variable i antes de incrementarla.

Cuando declaras ++i el compilador solo hace lo siguiente

i = i + 1;
return i;

Lo cual reduce en una variable tu código asi como en una línea menos en ensamblador.

Esto será verdad? ustedes que opinan?

Primer intento

Este es el primer intento por crear un espacio para compartir opiniones y código acerca del mundo de la programación y otros hechos.