es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Usando la palabra clave “volatile” en Java en un escenario sin hilos.

Entiendo que la palabra clave de Java volatile se utiliza en el contexto de multi-threading; el objetivo principal es leer de la memoria en lugar de la caché o incluso si se lee de la caché, se actualizará primero.

En el siguiente ejemplo, no hay concepto de multi-threading. Quiero entender si la variable i se almacenará en caché como parte de la optimización del código y, por lo tanto, se leerá desde la caché de la CPU en lugar de desde la memoria. En caso afirmativo, si la variable se declara como volatile, ¿se leerá definitivamente desde la memoria?

He ejecutado el programa varias veces, agregando y también eliminando la palabra clave volatile; pero, dado que no hay un tiempo constante para el bucle for, no pude llegar a una conclusión si se consume más tiempo cuando la variable se declara como volatile.

Todo lo que quiero ver es que el tiempo tomado desde la caché de la CPU es realmente menor que cuando se declara como volatile.

¿Es correcta mi comprensión? Si es así, ¿cómo puedo ver el concepto en funcionamiento, con un buen registro de los tiempos tanto para las lecturas de la caché de la CPU como para las lecturas de la memoria?

import java.time.Duration;
import java.time.Instant;

public class Test {

    volatile static int i=0;
//  static int i=0;

    public static void main(String[] args) {
        Instant start = Instant.now();

        for (i=0; i<838_860_8; i++) { // 2 power 23; ~ 1 MB CPU Cache
            System.out.println("i:" + i);
        }
        Instant end  = Instant.now();

        long timeElapsed = Duration.between(start, end).getSeconds();
        System.out.println("timeElapsed: " + timeElapsed + " seconds.");

    }
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es probable que la variable i se almacene en la caché como parte de la optimización del código, especialmente considerando el gran número de iteraciones en el bucle for. Si la variable se declara como volatile, es probable que se lea desde la memoria en lugar de la caché.

    Sin embargo, es difícil determinar el tiempo exacto que se toma de la caché de la CPU en comparación con las lecturas de memoria, ya que hay muchos factores que pueden afectar esto, incluyendo el hardware y el sistema operativo específicos que se estén utilizando. Además, la diferencia de rendimiento puede ser relativamente pequeña para un programa simple como el código de ejemplo.

    Si quieres ver cómo afecta volatile al rendimiento en un entorno más controlado, podrías intentar ejecutar programas multihilo más complejos donde los efectos de la caché en comparación con las lecturas de memoria son más pronunciados. También podrías usar herramientas de perfilado para obtener información más detallada sobre el uso de la CPU y la memoria durante la ejecución del programa.

Comments are closed.