2012-07-11 16 views
9

Leo de Effective Java que en ausencia de sincronización, la siguiente secuencia A a continuación se puede convertir en la secuencia B por la máquina virtual y se llama hoisting. También leí en alguna parte que si las variables no se declaran como instrucciones volátiles que involucran las variables se pueden reordenar. ¿Están izando y reordenando lo mismo?¿Están izando y reordenando lo mismo?

while (!done) sequence A  
    i++; 

    if (!done) 
    while (true) sequence B 
     i++; 
+0

posible duplicado de [¿por qué el punto de acceso optimiza lo siguiente mediante el uso de elevación?] (Http://stackoverflow.com/questions/9338180/why-hotspot-will-optimize-the-following-using-hoisting) –

Respuesta

13

Son ligeramente diferentes.

Alzando significa que ha sacado alguna operación de un bucle porque el bucle en sí no afecta el resultado de la operación. En su caso, está elevando la prueba condicional fuera del ciclo while.

Reordenar significa cambiar la secuencia de instrucciones de una manera que no afecte el resultado. Normalmente, esto sería instrucciones adyacentes sin dependencias de datos, p. no importa qué orden de llevar a cabo las dos afirmaciones siguientes:

int a = x; 
int b = y; 
0

Reordenamiento se relaciona con el rendimiento de la ejecución en tanto que el reordenamiento no afecta el rendimiento.

Alzando se hace para reordenar las instrucciones de la barrera de memoria.

1

El término "reordenamiento" tal como se utiliza en el Modelo de memoria de Java se refiere a todas las optimizaciones posibles que pueden afectar la corrección de los programas sincronizados incorrectamente.

Por lo tanto, reordenar en este sentido es un término genérico que incluye optimizaciones tales como elevación, efectos de ejecución fuera de orden, incoherencias causadas por la jerarquía de la memoria (es decir, cachés), y así sucesivamente.

Cuestiones relacionadas