2011-05-30 19 views
8

En los procesadores modernos de hoy en día, ¿hay alguna diferencia de rendimiento entre una comparación mayor que y mayor que o igual para una condición de bifurcación? Si tengo una condición que podría ser igual de fácil, ¿hay alguna ligera ventaja al elegir > sobre >= o viceversa? (Esto sería para un lenguaje compilado en hardware Intel o AMD)¿Hay alguna diferencia de rendimiento entre mayor que y mayor que o igual?

+1

Lo dudo, y si lo hubiera, sería tanto como el bigote de un gato. –

Respuesta

6

No debería haber ninguna diferencia notable entre la comparación de diferentes predicados, debido a la forma en que se calculan (cuidado que no he leído los manuales de x86 en detalle por lo que puede trabajar es diferente):

mayoría de las instrucciones produce varias banderas como subproducto, generalmente tiene al menos: acarreo (c), desbordamiento (o), cero (z) y negativo (n).

Usando esos predicados que son creados por una instrucción x-y (que crea los 4 anteriores de manera confiable) podemos deducir fácilmente todas las comparaciones deseadas trivialmente. Para números sin firmar:

x = y z 
x != y !z 
x < y !c 
x <= y !c + z 
x > y c . !z 
x >= y c 

Por lo tanto, apenas hace ninguna diferencia. Pero luego hay algunas diferencias, que casi siempre se reducen al hecho de que podemos usar TEST (que es AND y no una sustracción completa) o tener que usar CMP (esa es la resta). TEST es más limitado pero más rápido (generalmente).

También las arquitecturas modernas (comenzando desde c2d en el lado intel) a veces pueden fusionar dos μops en una macro operación, llamada fusión macro-op que tiene algunas bonitas ventajas. Y las reglas para eso cambian de una arquitectura a la siguiente y son un poco más largas. Por ejemplo, las ramas que prueban el desbordamiento, la paridad o la bandera de señal solamente (JO, JNO, JP, JNP, JS, JNS) pueden fusionarse con TEST, pero no con CMP en c2d y nehalems (you bet I looked that one up - section 7.5).

Entonces, ¿podemos decir que es complicado y no preocuparse por tales cosas? Eso es, excepto si está escribiendo un optimizador para un compilador, porque realmente, independientemente de lo que escriba en su código fuente, el compilador hará lo que quiera de todos modos, y por una buena razón (es decir, si JGE fuera teóricamente más rápido, tendría para escribir if (x < y) generalmente ..). Y si realmente necesita un consejo: Comparar contra 0 es a menudo más rápido.

3

No estoy muy seguro de cómo se realiza la implementación subyacente en la ALU/FPU, pero solo debería haber una operación para todos ellos (en tipos primitivos es decir)

Realmente espero que esto sea solo una pregunta porque tiene curiosidad y no está tratando de optimizar, esto nunca le dará un gran aumento de rendimiento y muy probablemente su código contendrá muy lejos peores problemas de rendimiento.

Puede evento implementar todos los operadores de relación con una sola:

 
a < b is the base 
a > b == b < a 
a >= b == !(a < b) 
a <= b == !(a > b) 

Esto por supuesto no es la forma en que está implementado en la CPU, esto es más trivia.

-1

Tengo serias dudas de que haya una diferencia.

Cuestiones relacionadas