¿El uso de operaciones bit a bit es realmente más rápido que las matemáticas normales en los procesadores modernos? [duplicar]

He visto varias fuentes (algunas aquí y en el artículo de Wikipedia sobre la operación bit a bit) dicen que usar el desplazamiento de bits para calcular es más rápido que la multiplicación/división/suma normal. Sin embargo, también mencionaron que eso solo se aplica a los procesadores más antiguos, y que la mayoría de los procesadores modernos han hecho que las velocidades sean prácticamente iguales.

¿Qué tan válida es esa declaración? ¿Es seguro en Java o C # usar operandos matemáticos regulares? ¿Es realmente necesario usar el bitshifting como sustituto de esos operandos?

preguntado el 22 de mayo de 12 a las 16:05

Suena como un experimento que podrías hacer por ti mismo. -

¡Bienvenido a Stack Overflow! Bonito avatar. :) -

2 Respuestas

Solo deja esto al compilador. Los buenos compiladores conocen el hardware al que se dirigen. Si el compilador sabe que las operaciones bit a bit son más rápidas, puede emitir código para hacerlo de esa manera. Siempre debe escribir el código legible por humanos de la forma más clara, la forma que exprese correctamente la operación que se está realizando. Deja que el compilador haga el resto.

En cuanto a si sigue siendo cierto o no que las operaciones bit a bit pueden ser más rápidas que la aritmética, creo que lo son. Ciertamente, muchos compiladores modernos de C++ emitirán código que utiliza operaciones bit a bit para la aritmética.

contestado el 22 de mayo de 12 a las 16:05

Bien gracias por la respuesta. He visto a algunas personas escribir código que incluye el cambio de bits y estaba tan confundido sobre por qué no solo usaron la multiplicación. ¡Gracias! - usuario1410566

Si alguien de mi equipo alguna vez intentara hacer aritmética con operaciones bit a bit, ¡eso resultaría en una sesión de revisión de código muy dolorosa! - David Heffernan

+1 por la dolorosa sesión de revisión de código =) - calcao

He escrito código con operaciones bit a bit, pero solo cuando tenía números de referencia duros para demostrar el rendimiento mejorado, y solo con una sesión de revisión de código muy exhaustiva. - Luis Wassermann

@Louis Siempre hay casos especiales y excepciones a cualquier regla. Pero supongo que el tipo de código al que se hace referencia en esta pregunta será de la forma <<1 para multiplicar por 2. Eso solo ofusca el código y casi invariablemente sin ningún beneficio. - David Heffernan

No estoy seguro de cuál es la escala de la diferencia entre el uso de operaciones bit a bit y el uso de operadores simples en las arquitecturas y compiladores actuales (supongo que... casi ninguno en la mayoría de los problemas).

Estoy basando mi corazonada en el hecho de que la mayoría del código que escribes hoy en día no genera cuellos de botella en las operaciones de la CPU, sino más bien en el acceso a la base de datos, E/S, red (sí, estoy siendo redundante aquí).

El compilador para JVM, por ejemplo, ya optimiza muchas operaciones en la arquitectura en la que está ejecutando su código, abstrayendo esta necesidad del desarrollador (para eso está ahí).

Un último punto que me gustaría señalar es... la legibilidad cuenta. No importa lo que argumenten algunos fanáticos de la operación bit a bit, la operación bit a bit en el medio de su código generalmente es mucho más menos legible por la mayoría de los desarrolladores que simplemente usar matemáticas estándar.

El costo de comprender el código y la mayor probabilidad de que alguien introduzca un error cuando el código necesita ser cambiado hace que, en mi humilde opinión, el riesgo supere con creces los beneficios. Es importante escribir un código eficiente, pero aún así tiene que ser legible por humanos.

Descargo de responsabilidad: hay podría Habría algunos dominios donde el número de operaciones matemáticas es tal que esto podría convertirse en un factor, pero esto ciertamente no es la norma.

contestado el 22 de mayo de 12 a las 16:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.