¿Existe una diferencia de rendimiento entre i++ y ++i en C?

Resuelto Mark Harrison asked hace 16 años • 14 respuestas

¿Existe una diferencia de rendimiento entre i++y ++isi no se utiliza el valor resultante?

Mark Harrison avatar Aug 24 '08 13:08 Mark Harrison
Aceptado

Resumen ejecutivo: No.

i++potencialmente podría ser más lento que ++i, ya que el valor anterior de i might debe guardarse para su uso posterior, pero en la práctica todos los compiladores modernos optimizarán esto.

Podemos demostrar esto mirando el código de esta función, tanto con ++icomo i++.

$ cat i++.c
extern void g(int i);
void f()
{
    int i;

    for (i = 0; i < 100; i++)
        g(i);

}

Los archivos son los mismos, excepto ++iy i++:

$ diff i++.c ++i.c
6c6
<     for (i = 0; i < 100; i++)
---
>     for (i = 0; i < 100; ++i)

Los compilaremos y también obtendremos el ensamblador generado:

$ gcc -c i++.c ++i.c
$ gcc -S i++.c ++i.c

Y podemos ver que tanto el objeto generado como los archivos ensambladores son los mismos.

$ md5 i++.s ++i.s
MD5 (i++.s) = 90f620dda862cd0205cd5db1f2c8c06e
MD5 (++i.s) = 90f620dda862cd0205cd5db1f2c8c06e

$ md5 *.o
MD5 (++i.o) = dd3ef1408d3a9e4287facccec53f7d22
MD5 (i++.o) = dd3ef1408d3a9e4287facccec53f7d22
Mark Harrison avatar Aug 24 '2008 06:08 Mark Harrison

De Eficiencia versus intención de Andrew Koenig:

En primer lugar, no es nada obvio que ++isea más eficiente que i++, al menos en lo que respecta a variables enteras.

Y :

Entonces, la pregunta que uno debería hacerse no es cuál de estas dos operaciones es más rápida, sino cuál de estas dos operaciones expresa con mayor precisión lo que está tratando de lograr. Sostengo que si no estás usando el valor de la expresión, nunca hay una razón para usar i++en lugar de ++i, porque nunca hay una razón para copiar el valor de una variable, incrementar la variable y luego desechar la copia.

Entonces, si no se usa el valor resultante, usaría ++i. Pero no porque sea más eficiente: porque expresa correctamente mi intención.

Sébastien RoccaSerra avatar Sep 02 '2008 11:09 Sébastien RoccaSerra