2010-08-17 11 views
5

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é?

+11

¿No es un oxímoron optimizado un bucle infinito? –

+4

en serio?Mira la salida del compilador. –

+0

Duplicado exacto http://stackoverflow.com/questions/885908/while-1-vs-for-is-there-a-speed-difference/ –

Respuesta

16

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 
+0

Ya , También probé el tiempo (1) y para (;;) con gcc y no obtuve ninguna diferencia. – iSegFault

+0

+1 para usar Clang en lugar de GCC. –

45

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.

+20

Tal vez espere un poco más ...? – FrustratedWithFormsDesigner

+0

Manténgalo vigilado y avísenos. ;) –

+0

mejor comentario ever =) – Molske

4

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?

+6

Hecho real: Jon Skeet puede ejecutar un ciclo infinito en tres segundos y medio. –

+0

@mmyers: ¿Creí que era Chuck Norris? – FrustratedWithFormsDesigner

+1

... y al eliminar una sola línea de código, puede optimizarlo para que se ejecute en 0 segundos. –

0

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.

0

Lo mismo. el compilador lo traducirá a una sola instrucción JMP.

2

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.

Cuestiones relacionadas