2009-10-03 10 views

Respuesta

33

Respuesta corta: No. El compilador del código fuente no reemplazará una multiplicación por dos con un cambio de bit.

Respuesta larga: No lo hará, porque no puede saber si un cambio de bit es más rápido que una multiplicación en la plataforma. El código finalmente se ejecutará. Entonces, la pregunta debería ser si una VM específica reemplazará la multiplicación con un cambio de bit, y probablemente lo haga. Experimenté un poco con esto para optimizar un bloque de código y es interesante que el Hotspot de Sun muestra un comportamiento diferente aquí, dependiendo de si el programa se ejecuta en un AMD o en una CPU Intel (al menos con las CPU que probé). En cualquier caso, una multiplicación con una potencia de dos se reemplaza con un cambio de bit, pero para las multiplicaciones con una potencia de dos +/- 1 (3, 5, 7, 9, 15, 17, ...), la zona activa generan un cambio de bit y una suma o resta para las CPU de Intel, al tiempo que generan una multiplicación para las CPU de AMD, ya que la CPU de AMD ejecuta una multiplicación mucho más rápida que la CPU de Intel. Por supuesto, es posible que este comportamiento difiera entre diferentes modelos de CPU de cada proveedor.

Si está interesado en saber qué está haciendo realmente la máquina virtual, es bastante beneficioso obtener la compilación de depuración de jdk7 y habilitar volcados del código de ensamblador generado por el compilador de zona activa.

+7

+1 para comparación amd/intel –

10

No adivine en segundo lugar un compilador Java moderno a menos que sepa exactamente lo que está haciendo. Esto no solo se aplica a las matemáticas simples como preguntas, sino a todo. Ej .: me gusta el control de flujo.

Las personas que son más inteligentes que nosotros han puesto mucho esfuerzo en hacerlo todo súper rápido.

+2

¿Cómo está pidiendo == segundo adivinar? – HRJ

+1

@HRJ Cuando se trata de una cuestión de optimización prematura –

+0

no veo cómo se podría inferir que se trata de un caso de "optimización prematura". Además, la pregunta no es solo relevante para el caso del OP, sino para muchos otros casos que los visitantes de StackOverflow pueden tener. – HRJ

4

En general, no se puede ser más astuto que JVM a menos que exista un nivel muy alto que saber que no se puede deducir automáticamente. Esto generalmente significa que hay un mejor algoritmo disponible que el que se usa actualmente en lugar de tener que ajustar manualmente su fuente. Puede utilizar el generador de perfiles jvisualvm disponible en los últimos JDK de Java 6 para investigar su programa y ver dónde están los cuellos de botella. Por ejemplo, el gasto de creación de objetos nuevos en lugar de reutilizar los antiguos ha disminuido radicalmente en los últimos 10 años, por lo que no debe seguir ningún consejo anterior para ajustar su programa java sin examinar si aún se mantiene.

Sin embargo, descubrirá que mantener su programa simple y, sobre todo, legible, lo hará mucho más fácil de mantener tanto para usted como para los futuros programadores. Cualquier complejidad innecesaria desconcertará a sus futuros lectores, y tendrá que decir en un comentario por qué DEBE ser así (de lo contrario, simplemente lo volverán a refaccionar en su forma original :)

+0

Siempre escriba primero el código de limpieza. – jcolebrand