Digamos que el póster original tenía un bucle que realmente querían optimizar, cada instrucción contada. ¿Cómo podemos descubrir, empíricamente, la respuesta a su pregunta?
gcc al menos tiene un interruptor útil, aunque poco común, '-S'. Vacia la versión de código ensamblador del archivo .c y se puede usar para responder preguntas como OP plantea. Escribí un programa simple:
int main()
{
int sum = 0;
for(int i=1;i<=10;++i)
{
sum = sum + i;
}
return sum;
}
y corrió: gcc -O0 -std=c99 -S main.c
, la creación de la versión de montaje del programa principal. He aquí el contenido de main.s (con algunos de la pelusa eliminado):
movl $0, -8(%rbp)
movl $1, -4(%rbp)
jmp .L2
.L3:
movl -4(%rbp), %eax
addl %eax, -8(%rbp)
addl $1, -4(%rbp)
.L2:
cmpl $10, -4(%rbp)
jle .L3
Usted no necesita ser un experto ensamblaje de averiguar lo que está pasando. movl mueve valores, addl agrega cosas, cmpl se compara y jle significa 'jump if less than', $ es para constantes. Está cargando 0 en algo - eso debe ser 'suma', 1 en otra cosa - ¡ah, 'yo'! Un salto a L2 donde hacemos la comparación de 10, salta a L3 para hacer el complemento. Llega a L2 para la comparación de nuevo. ¡Ordenado! A para bucle.
cambiar el programa a:
int main()
{
int sum = 0;
int i=1;
for(;i<=10;++i)
{
sum = sum + i;
}
return sum;
}
Vuelva a ejecutar gcc y el conjunto resultante será muy similar. Hay algunas cosas pasando con la grabación de números de línea, por lo que no serán idénticos, pero el conjunto termina siendo el mismo. Mismo resultado con el último caso. Entonces, incluso sin optimización, el código es casi el mismo.
Para divertirse, vuelva a ejecutar gcc con '-O3' en lugar de '-O0' para permitir la optimización y ver el archivo .s.
main:
movl $55, %eax
ret
gcc no sólo descubrió que estábamos haciendo un bucle, pero también se dio cuenta de que iba a ser ejecutar un número constante de veces que lo hizo el lazo para nosotros en tiempo de compilación, tiraron a cabo 'i' y la 'suma' y codificó la respuesta con fuerza - 55! Eso es RÁPIDO, aunque un poco artificial.
¿Moral de la historia? Dedique su tiempo a garantizar que su código esté limpio y bien diseñado. Código de legibilidad y mantenimiento. Los muchachos que viven del rocío de las montañas y los cheetos son mucho más listos que nosotros y se han encargado de la mayoría de estos simples problemas de optimización para nosotros. ¡Que te diviertas!
Este tipo de pregunta es realmente una mala señal ... –
+1 Por preguntar esto, para que el mito pueda ser debuffed – Andres