Duplicar posibles:
while (1) Vs. for (;;) Is there a speed difference?Mejor bucle infinito
Hola,
¿Qué es mejor, más rápido y de forma más optimizada para implementar bucle infinito - for (;;) o mientras (1)? ¿y por qué?
Duplicar posibles:
while (1) Vs. for (;;) Is there a speed difference?Mejor bucle infinito
Hola,
¿Qué es mejor, más rápido y de forma más optimizada para implementar bucle infinito - for (;;) o mientras (1)? ¿y por qué?
En cualquier compilador normal, no debería haber absolutamente ninguna diferencia. Por ejemplo, esto es lo que genera LLVM-clang
(con la bandera -O3
) para while (1) {}
:
.file "test.c"
.text
.globl main
.align 16, 0x90
.type main,@function
main:
pushl %ebp
movl %esp, %ebp
.align 16, 0x90
.LBB0_1:
jmp .LBB0_1
Nota la parte jmp .LBB0_1
, que es el bucle infinito actual. Para el tipo for (;;)
, genera absolutamente el mismo código.
También puede probar con otros compiladores para divertirse, pero lo mejor es dejar de preocuparse por ello.
bien, sólo tenía que tratar con gcc
así:
.file "test.c"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
.L2:
jmp .L2
Ya , También probé el tiempo (1) y para (;;) con gcc y no obtuve ninguna diferencia. – iSegFault
+1 para usar Clang en lugar de GCC. –
Prefiero for(;;)
porque no prueba nada y semánticamente esto es lo que quiere decir. No tiene mucho sentido seguir las pruebas si 1 es cierto. Sin embargo, cualquier programador profesional de C debe reconocer inmediatamente ambos modismos, ya que ambos se utilizan.
En términos de rendimiento real no debería haber diferencia. El compilador optimizará la prueba.
He intentado probar ambos para ver cuál es más rápido pero ninguno de ellos se ha completado aún.
Tal vez espere un poco más ...? – FrustratedWithFormsDesigner
Manténgalo vigilado y avísenos. ;) –
mejor comentario ever =) – Molske
yo diría no es más optimizado, ya que ninguno va a realizar la tarea de bucle infinito en cualquier cantidad medible de tiempo.
¿Es realmente posible llegar al infinito más o menos eficientemente?
Hecho real: Jon Skeet puede ejecutar un ciclo infinito en tres segundos y medio. –
@mmyers: ¿Creí que era Chuck Norris? – FrustratedWithFormsDesigner
... y al eliminar una sola línea de código, puede optimizarlo para que se ejecute en 0 segundos. –
Esta es mi opinión (sin investigación realizada):
Al depurar código como me paso a través de él, para los bucles que me hace ir a las tres partes de la primera vez, luego dos el resto de las iteraciones. Sin embargo, el ciclo while solo tiene uno. Solo un pensamiento.
Lo mismo. el compilador lo traducirá a una sola instrucción JMP.
En teoría, un completamente ingenuo compilador podría almacenar el literal '1' en el espacio binario (desperdicio) y comprobar si 1 == 0 cada iteración (perdiendo tiempo y más espacio).
En realidad, sin embargo, incluso con optimizaciones "sin", los compiladores seguirán reduciendo ambos a la misma. También pueden emitir advertencias porque podrían indicar un error lógico. Por ejemplo, el argumento de while podría definirse en otro lugar y no te das cuenta de que es constante.
¿No es un oxímoron optimizado un bucle infinito? –
en serio?Mira la salida del compilador. –
Duplicado exacto http://stackoverflow.com/questions/885908/while-1-vs-for-is-there-a-speed-difference/ –