Primero tienes que preguntarte qué significa realmente while(1)
o while(2)
.
Ahora suponga que un compilador es lo suficientemente tonto y genera una instrucción de comparación, por lo que el código compara 1 contra cero en el primer bucle y 2 contra cero en el segundo bucle.
Entonces, tu compilador hipotético está básicamente expandiéndolos para que sean while(1 != 0)
y while(2 != 0)
, cuyos resultados serían un 1
(verdadero), o un 0
(falso). ¿Este compilador tonto también va a comparar aquellos con 0, y si es así, qué va a hacer con los resultados de esa comparación? Veo un problema de recursión infinita pasando por allí.
Sin embargo, dejando eso a un lado, y asumimos que solo hace una comparación y toma el resultado de esa comparación como un valor lógico de sí / no, ¿cómo esperaría que el compilador implementara eso como lenguaje ensamblador? Bueno, obviamente eso depende de la arquitectura. Si tienes un operador de comparación entonces obviamente debería usar eso. Algo así como, en pseudo-montaje:
_while:
ld r0, 1
ld r1, 0
cmp r0, r1
beq _while_finished // jump if the compare was equal
// ... loop code in here
bra _while
_while_finished:
// ... continue with the code.
Reemplazar el 1 por un 2 dejaría el mismo número de instrucciones.
Pocos microcontroladores pequeños tienen un cmp
o similar, por lo que la forma más común es restar un valor de otro y probar si el resultado es cero. Por ejemplo:
_while:
ld r0, 1
ld r1, 0
sub r0, r0, r1 // Subtract r1 from r0 and leave the result in r0
beqz _while_finished // Branch if zero flag set by last math operation
// ... loop code in here
bra _while
_while_finished:
// ... continue with the code.
De nuevo, sustituir el 1 con un 2 dejaría el mismo número de instrucciones. Entonces, debes preguntarte ahora, con ese código, ¿qué parte podría llevar más tiempo con un 2 que con un 1? Solo la instrucción sub
tiene el potencial para hacer eso, y solo si el diseño del chip es increíblemente pobre. Normalmente, la instrucción ALU realiza una instrucción sub
o add
como una sola operación, y los valores involucrados no tienen relación con el tiempo empleado. Solo si la ALU realiza un sub a, b, c
cargando primero a
con b
y luego disminuyéndolo c
veces, tendría alguna posibilidad de que los números involucrados tuvieran alguna relación con el tiempo tomado, y nunca he venido a través de una forma tan primitiva de hacerlo. A menos que, por supuesto, el chip haya sido diseñado por la misma persona que diseñó el compilador;)
Entonces la respuesta es:
En cualquier sistema normal, no, los operandos de la comparación no tendrían relación con el tiempo necesario para realizar la comparación.