switch method length con array java blackberry

method - switch con string java



Usar variables estáticas para Strings (4)

Estos son los detalles de la VM Blackberry. Otra VM podría hacerlo de manera diferente.

Nota al margen: no preste demasiada atención a la optimización hasta que realmente se encuentre con los problemas de rendimiento (esto se llama "optimización prematura") porque si lo hace es muy posible que el rendimiento se filtre en el lugar donde nunca esperaría a.

a continuación, el contenido está tomado de la práctica recomendada: Escribir un código eficiente pero no entendí por qué

private static String x = "example";

más rápido que

private static final String x ="example";

¿Alguien puede explicar esto?

Usar variables estáticas para Strings

Cuando define campos estáticos (también llamados campos de clase) de tipo String, puede aumentar la velocidad de la aplicación utilizando variables estáticas (no finales) en lugar de constantes (finales). Lo contrario es cierto para los tipos de datos primitivos, como int.

Por ejemplo, puede crear un objeto String de la siguiente manera:

private static final String x = "example";

Para esta constante estática (indicada por la palabra clave final), cada vez que usa la constante, se crea una instancia de cadena temporal. El compilador elimina "x" y lo reemplaza con la cadena "ejemplo" en el bytecode, de modo que BlackBerry® Java® Virtual Machine realiza una búsqueda de tablas hash cada vez que hace referencia a "x".

Por el contrario, para una variable estática (sin palabra clave final), la cadena se crea una vez. BlackBerry JVM realiza la búsqueda de tabla hash solo cuando inicializa "x", por lo que el acceso es más rápido.

private static String x = "example";

Puede usar constantes públicas (es decir, campos finales), pero debe marcar las variables como privadas.


Hay un grupo literario String en tiempo de ejecución. Cuando crea las cadenas como final, la JVM crea una copia de la cadena cada vez que la usa. Cuando el String no es definitivo, se inserta en el conjunto literal String la primera vez que lo crea y, a continuación, solo se busca desde el grupo, esto evita las copias de los Strings.


No estaba al tanto de esto, pero tiene sentido para mí:

La JVM tiene una Caché Literal de cadena interna. Cada vez que creas un String usando un literal, la JVM tiene que buscarlo en el caché y, si no está allí, almacenarlo.

Ahora un compilador puede alinear una variable final con un literal String, porque se conoce en tiempo de compilación y parece ser una buena idea para el rendimiento.

Entonces tu código:

static final String CONST = "myconst"; ... if (CONST.equals(aVar)) ... case CONST ...

está reescrito por el compilador para:

static final String CONST = "myconst"; ... if ("myconst".equals(aVar)) ... case "myconst" ...

Si la implementación de JVM no es lo suficientemente inteligente, necesita buscar "myconst" tres veces en este ejemplo.

Cuando no marca CONST como "final", el compilador no puede "optimizarlo" ya que la variable puede cambiar en tiempo de ejecución. Su código se compilará 1: 1 y la JVM solo necesita buscar el Objeto en la variable.

Por cierto: las implementaciones de JVM incorrectas no deberían definir su estilo de codificación. "final" ofrece mucha seguridad, siempre y cuando no afecte realmente a su rendimiento: no importa si aumenta o disminuye la velocidad, de todos modos es diferente para la próxima JVM


el texto lo explica, solo léelo.

pero reformularlo: es más rápido porque lo es. La forma en que se hace blackberry jvm es mejor usar la versión no final. Es así porque está diseñado de esa manera