Es el operador de desigualdad más rápido que el operador de igualdad?


Sé que esto es una microoptimización, así que pregunto por pura curiosidad.

Lógicamente, un microprocesador no necesita comparar todos los bits de ambos operandos de un operador de igualdad para determinar un resultado "FALSO".

Tenga en cuenta que esto está relacionado con la programación porque afecta la velocidad de ejecución de un programa.

Author: Mackenzie, 2009-06-23

10 answers

Por lo general, el microprocesador hace la comparación utilizando puertas eléctricas y no paso a paso como ese. Comprueba todos los bits a la vez.

 39
Author: Mehrdad Afshari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-23 00:02:49

Esto depende de su plataforma, pero en general, funcionará de manera idéntica.

Por ejemplo, en X86, puede ver esto mirando cómo funciona el ensamblaje. Echa un vistazo a las operaciones de flujo de control de ensamblaje X86 - ya sea que estés haciendo igualdad o desigualdad, se hace como 2 operaciones.

Primero, realiza una operación CMP (comparación). A continuación, haga una comprobación para ver si la comparación es igual, no igual, etc. Esto es solo comprobar los resultados de la comparación - en ambos casos, estás haciendo 2 operaciones.

En muchos lenguajes de programación de nivel superior, sin embargo, las cosas son diferentes. Muchos idiomas definen la desigualdad en términos de igualdad - para comprobar la desigualdad, haces la comprobación de igualdad, luego una segunda comprobación para ver si es falsa. Esto hace que la igualdad sea (microscópicamente) más rápida en estos idiomas. Muchos idiomas le permiten escribir específicamente ambos, también, pero muchas personas tienden a escribir desigualdad en términos de igualdad, lo que nuevamente hace que la igualdad, en general, un poco más rápido.

 26
Author: Reed Copsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-23 00:08:13

Parece que debería leer el Manual de Referencia de Optimización de Arquitecturas Intel 64 e IA-32.

Busque allí la "Latencia de la canalización" y el "Retraso de la canalización" en las instrucciones que use. Basta con decir que todo lo que haces con ints tarda alrededor de 1 ciclo de reloj para ejecutar (4 mil millones de los que un segundo). La lectura de los datos de la memoria puede tomar 100-1000 dependiendo de la cantidad de datos que está trabajando con. Mucho más importante.

 11
Author: Tom Leys,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-23 00:08:17

La comparación generalmente se implementa como una resta que no tiene en cuenta el resultado. El sumador en la CPU operaría en todos los bits simultáneamente, por lo que esta es una operación de tiempo constante.

La igualdad es entonces solo determinar si la salida es 0. En x86, hay banderas que se establecen como resultado de la comparación y la rama se realiza a través de jz o jnz (saltar si es cero, saltar si no es cero). Así que no, no habría ninguna diferencia de velocidad real.

Otras plataformas (como ARM e IA64) se comportan similar.

 10
Author: Michael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-23 00:22:34

Las instrucciones se ejecutarán a la misma velocidad, como sugieren las otras respuestas.

Donde podría encontrar una diferencia sería en la predicción de ramas o efectos de caché. Esto variará de un procesador a otro y de un compilador a otro, por lo que es imposible hacer generalizaciones. Si estás en el nivel en el que esto haría una diferencia, la única manera de saberlo es probarlo y medirlo.

 3
Author: Mark Ransom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-23 00:34:11

La operación de comparación se produce en el borde ascendente (o tal vez descendente) de la señal del reloj del microprocesador. Entonces la siguiente operación ocurre en el siguiente ciclo de reloj. Por lo tanto, en términos de velocidad de ejecución, la igualdad y la desigualdad toman la misma cantidad de tiempo para casi todos los procesadores en el mercado hoy en día.

Digo casi porque recuerdo haber leído sobre algunos procesadores que se suponía que no estaban basados en relojes, sino en el tiempo de operación, por lo que si de hecho el op de comparación fue más rápido que el add op, entonces un conjunto de n compara tomaría menos tiempo que n agrega. Pero estoy aproximadamente 99% seguro de que fue solo un proyecto de investigación y no un producto comercial:)

 2
Author: Mark Rushakoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-23 00:03:29

Hay algunos casos menores en los que puede tener algún efecto.

En los procesadores ARM (para la arquitectura de conjunto de instrucciones (ISA) de 32 bits/no pulgar), todas las instrucciones son condicionales. A veces puede salirse con la suya con un bucle interno que tiene una sola rama (desde el final hasta el inicio) a pesar de múltiples condiciones. En algunos casos, tener una comparación lógica (TEQ) perturba algunas banderas (afecta negativo (N) y cero (Z), pero no carry (C) o overflow (V)), permite que el código peludo evite una rama la instrucción (no).

Inversamente, IIRC (nunca lo he programado realmente, pero he mirado la salida de un compilador de C hace más de una década) 68000 tiene una instrucción literal EOR/XOR solo para el registro D4. Así que una comparación aritmética probablemente sería mejor (aunque todavía podría ignorar las banderas extrañas-el punto es que el conjunto de instrucciones es un poco irregular).

Como se mencionó en un póster anterior, la mayor parte de la acción es más alta con memoria, disco, red y web latencia del servicio.

 2
Author: Tom Hawtin - tackline,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-23 01:15:37

Si quisiera plantear esto a una pregunta más general, tendría que considerar una distribución razonable de respuestas VERDADERAS y FALSAS, y tendría que considerar la longitud de palabra arbitraria, incluso más larga que un registro.

En los algoritmos de búsqueda (y la ordenación puede considerarse una extensión de la búsqueda) es más común usar operadores como "

En cualquier caso, toman O(longitud de la palabra) número de comparaciones de bits, aunque, si la longitud de la palabra es

 2
Author: Mike Dunlavey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-24 20:28:50

La cantidad de tiempo que toma hacer una comparación como esta generalmente es un ciclo de reloj.

Un procesador de 32 bits hará los 32 bits a la vez; un procesador de 64 bits hará 64 bits a la vez.

Si hay un retraso, o pérdida, en la canalización sería porque el operando no está disponible y tuvo que ser recuperado. Ahí es donde está la mayor sobrecarga. Pero eso se habría hecho en un trozo apropiado para la arquitectura del procesador, por lo que todavía se habría tirado como un unidad de 32 o 64 bits.

 1
Author: lavinio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-23 00:08:08

Un aspecto que todo el mundo está asumiendo es que está hablando de instrucciones de nivel de registro. Todo el mundo tiene razón, es básicamente discutible en un nivel de CPU de las cosas. E incluso más arriba, la mayoría de las operaciones de alto nivel escriben la desigualdad como una llamada a la igualdad negada.

Sin embargo, incluso más arriba, usar la optimización del interrogador funcionaría en ambos sentidos. Es decir, la igualdad se puede escribir tan eficientemente como la desigualdad.

Además, hasta el punto de las personas interesadas en operaciones de montaje, el único la diferencia entre un CMP y un SUB es qué banderas se establecen. Por lo general, se ejecutan con las mismas partes de la máquina ya que CMP debe devolver banderas que representan igualdad, menor que y mayor que.

 1
Author: Adam Luter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-25 11:24:25