No, no hay problemas de rendimiento asociados con los operadores de comparación. Y cualquier buen compilador optimizaría algo así de trivial de todos modos.
No estoy seguro de dónde recibió la sugerencia de utilizar "i> -1" en lugar de "i> = 0". En la arquitectura x86, no hace ninguna diferencia que se utiliza: cualquiera de los casos tiene exactamente dos instrucciones ... uno para comparar y uno para saltar:
;; if (i > -1) {
cmp eax, -1
jle else
then:
...
else:
;; if (i >= 0) {
cmp eax, 0
jl else
then:
...
else:
en la mayoría de las arquitecturas RISC, que yo sepa, "i> = 0 "en realidad puede ser más rápido ya que generalmente hay un registro de cero dedicado, y" i> -1 "puede requerir cargar una constante. Por ejemplo, MIPS solo tiene una instrucción < (no < =). (! Ingenuamente) Aquí es cómo serían las dos construcciones expresaron en MIPS lenguaje ensamblador:
// if (i >= 0) { (assuming i is in register %t0)
stl $t1, $0, $t0 // in C: t1 = (0 < t0)
beq $t1, $0, else // jump if t1 == 0, that is if t0 >= 0
nop
then:
...
else:
// if (i > -1) { (assuming i is in register %t0)
addi $t2, $0, -1 // in C: t2 = -1
stl $t1, $t2, $t0 // in C: t1 = (t2 < t0) = (-1 < t0)
bne $t1, $0, else // jump if t1 != 0, that is if t0 > -1
nop
then:
...
else:
Así, en el caso ingenuo, en general, en realidad será una instrucción más rápida de hacer "i> = 0" en MIPS . Por supuesto, el código RISC es tan optimizable que un compilador probablemente cambiaría cualquiera de estas secuencias de instrucciones casi irreconocible :-)
Entonces ... la respuesta corta es no no no, no hay diferencia.
'(no no no, ninguna diferencia) =! (! (! (! Diferencia))) =! (! Diferencia)) = diferencia';) –
@ M.kazemAkhgary, difícil de discutir con ese. Ahora estoy un poco tentado de agregar un 5º "no" :-P –