optimización de java

la optimización del código de Java (en)

El modificador final (1) medida de lo posible la clase especificada, método

Con la clase modificador final no se deriva. En la API de núcleo Java, hay muchos ejemplos de aplicaciones finales, tales como java.lang.String, toda la clase son final. Especificar el calificador final para la clase permite a la clase no se puede heredar, designado como formas de hacer que los métodos de modificador final no puede ser anulado. Si una clase como final, la clase de todos los métodos son finales. compilador Java buscará oportunidades en el final con todos los métodos, papel significativo en línea para mejorar la eficiencia operativa de Java, una medida que puede mejorar el rendimiento en un promedio del 50%.

(2) tratar de reutilizar objetos

Se debe utilizar StringBuilder / StringBuffer lugar especialmente si un objeto String, no se conecta la cadena. Desde Java Virtual Machine no sólo necesita tiempo para generar el objeto, el futuro también puede tener que pasar tiempo en estos objetos para la recolección y disposición de basura, por lo tanto, generar demasiados objetos traerá un gran impacto en el rendimiento del programa.

(3) Siempre que sea posible, utilizar variables locales

parámetros de llamada método de entrega y variables temporales creadas en la llamada se almacenan en la pila, más rápido, otras variables, como variables estáticas, variables de instancia, etc., se crean en el montón, más lenta velocidad. Además, las variables de pila creados con el método de operación se ha completado, el contenido se ha ido, sin recolección de basura adicional.

(4) cerrar el flujo de

de programación Java, las conexiones de base de datos, debe tener cuidado al I / O operaciones de ruta, después de su uso, cierro rápidamente hacia abajo para liberar recursos. Debido a estos grandes objetos operación causará grandes sistemas generales, el más mínimo error dará lugar a consecuencias graves.

(5) para minimizar la duplicación de variables de cálculo

Un concepto claro, las llamadas a métodos, incluso si el método es sólo una frase, hay también consume, incluyendo la creación de un marco de pila para proteger el lugar al llamar al método, el sitio de recuperación cuando los métodos de llamadas terminadas. Así, por ejemplo, las siguientes operaciones:

for (int i = 0; i <list.size (); i ++)

{...}

alternativas recomendadas:

for (int i = 0, longitud = list.size (); i <longitud; i ++)

{...}

De esta manera, list.size () mucho tiempo, lo que reduce el consumo de una gran cantidad

(6) maximizar el uso de la estrategia de carga diferida, que sólo se crea cuando sea necesario

Por ejemplo:

Cadena str = "AAA";

si (i == 1)

{

 list.add (str);

}

alternativas recomendadas:

si (i == 1)

{

 Cadena str = "AAA";

 list.add (str);

}

(7) con precaución anormal

perjudicial para el rendimiento anormal. Una excepción es lanzada primero en crear un nuevo objeto, Throwable llamada a la función constructor de interfaz método de sincronización local llamado fillInStackTrace () es, el método fillInStackTrace () para comprobar la pila para recoger información de seguimiento de llamadas. Siempre y cuando no se produce una excepción, la máquina virtual Java debe ajustar la pila de llamadas, ya que un nuevo objeto se crea en el proceso. Una excepción sólo se puede utilizar para el tratamiento de errores, no se debe utilizar para controlar el flujo del programa.

(8) No usar en un bucle try ... catch ..., debe ponerlo en el exterior

De acuerdo con los puntos de vista planteados por los internautas, que creo que es cuestionable

(9) si la longitud estimada del contenido que se añade está situado en la parte inferior de la forma de matriz, herramientas especificadas longitud inicial

Tal como ArrayList, LinkedLlist, StringBuilder, StringBuffer, HashMap, HashSet, etc., con el ejemplo StringBuilder:

StringBuilder () // asignación de espacio por defecto es de 16 caracteres

StringBuilder (int size) // caracteres por defecto de tamaño de asignación de espacio

StringBuilder (String str) // asignación por defecto es de 16 caracteres + str.length (espacio) caracteres

Por clase (denominada en la presente memoria como justo por encima del StringBuilder) constructor para establecer su capacidad inicial, que puede mejorar significativamente el rendimiento. Por ejemplo bar StringBuilder, de longitud indica el número de caracteres en la corriente StringBuilder pueden sostener. Debido a que el momento en que alcance la capacidad máxima StringBuilder, será en sí aumentar la capacidad actual de 2 más 2 veces, cada vez StringBuilder alcanzó su capacidad máxima, se tendrá que crear una nueva matriz de caracteres y luego el carácter antiguo copiar el contenido de la matriz a una nueva serie de caracteres - este es un rendimiento operativo muy rentable. Imagínese, si se puede estimar la matriz de caracteres para almacenar aproximadamente 5000 caracteres sin especificar la longitud de la potencia de 2 más cercano a 5000 es 4096, un momento de expansión más 2 sin tener en cuenta, a continuación:

Sobre la base de la 4096, 8194 y luego aplicar un tamaño de matriz de caracteres, agregue hasta el equivalente de un presentadas 12290 caracteres tamaño de la matriz, si un inicio puede especificar el tamaño de la matriz de caracteres 5000, el ahorro de espacio más que duplicado

Los originales 4096 caracteres copiados a la nueva serie de caracteres para ir

De esta manera, una pérdida de espacio de memoria y reducir la eficiencia del código. Por lo tanto, a la matriz subyacente con el fin de lograr el conjunto de herramientas para establecer una capacidad inicial razonable que no está mal, traerá resultados inmediatos. Sin embargo, cabe destacar que esta matriz como HashMap para lograr el set list es +, usted estima el tamaño inicial y el tamaño del conjunto, al igual que, sólo por la posibilidad de un objeto de conexión en una mesa es casi cero. Recomendado para establecer el tamaño inicial N-ésima potencia de 2, si se estima que hay 2.000 elementos previstos nuevo HashMap (128), nuevo HashMap (256) puede ser utilizado.

(10) al copiar grandes cantidades de datos utilizando System.arraycopy () de comandos

(11) utilizando una operación de cambio de multiplicación y división

Por ejemplo:

para (val = 0; val <100000; val + = 5)

{

 con a = 8 *;

 b = val / 2;

}

La operación de cambio puede mejorar considerablemente el rendimiento, ya que en la parte inferior del equipo, la posición de funcionamiento es la más conveniente, más rápido, se propone modificado como sigue:

para (val = 0; val <100000; val + = 5)

{

 a = val << 3;

 b = val >> 1;

}

operación de cambio puede ser rápido, pero puede hacer que el código entiende menos bien, lo mejor es añadir las observaciones que considere pertinentes.

No continúe para crear objetos dentro (12) referencias circulares

Por ejemplo:

for (int i = 1; i <= cuenta; i ++)

{

    Object obj = new Object ();   

}

Esta práctica puede conducir a la memoria tener copias recuento de objetos de referencia de objeto, contar mucho, entonces es el coste de la memoria, se recomienda leer:

Object obj = null;

for (int i = 0; i <= cuenta; i ++)

{

    obj = new Object ();

}

En este caso, sólo una memoria de referencia objeto de objetos, cada nuevo objeto () cuando, objeto Objeto punto de referencia a diferentes objetos de nada, pero sólo un recuerdo, por lo tanto en gran medida ahorrar espacio de memoria para arriba.

(13) en base a la eficiencia y la comprobación de tipos array consideraciones deben utilizarse tanto como sea posible, utilice un ArrayList cuando no puede determinar el tamaño de la matriz

(14) para hacer uso de HashMap, ArrayList, StringBuilder, a menos que las necesidades de seguridad de rosca, o no recomiendan el uso Hashtable, Vector, StringBuffer, después de tres mecanismos de sincronización que condujeron a la utilización de sobrecarga de rendimiento

(15) No declarar la matriz como public static final

Debido a que este carece de sentido, sólo se define una referencia para el static final, o el contenido de la matriz se puede cambiar libremente, la matriz se declara como una vulnerabilidad de seguridad pública, lo que significa que la matriz puede ser cambiado por clase externa

(16) adecuado para hacer uso de un solo caso de Ejemplo

Singleton puede reducir la carga de la carga, reducir el tiempo de carga y mejorar la eficiencia de la carga, pero no todos los lugares son adecuados para un solo caso, en términos simples, un solo caso se aplica principalmente a los tres aspectos siguientes:

Control de la utilización de recursos por parte de la sincronización de hilos para controlar el acceso concurrente a los recursos

Generación de un ejemplo de control, con el fin de ahorrar recursos

Compartido de datos de control, en condiciones que no están directamente relacionados con el establecimiento, de manera que la comunicación entre múltiples procesos o hilos irrelevantes

(17) tratar de evitar el uso arbitrario de variables estáticas

Ya sabes, cuando la referencia a un objeto se define como una variable estática, entonces GC, normalmente, ni reclamar la memoria heap ocupada por objetos, tales como:

Una clase pública

{

    estático B privada b = new B (); 

}

En este variable estática b del ciclo de vida de la misma clase A, clase A si no desinstalado, entonces la referencia de objeto B punto B será la memoria permanente, hasta que se termine el programa

(18) la sesión de eliminación oportuna ya no es necesario

Para borrar la sesión ya no está activa, muchos servidores de aplicaciones tienen el tiempo de espera de sesión predeterminado, normalmente 30 minutos. Cuando la necesidad servidor de aplicaciones para preservar más la conversación, si no hay memoria suficiente, el sistema operativo va a transferir parte de los datos en el disco, el servidor de aplicaciones también se puede basar en MRU (más recientemente, el de uso más frecuente) algoritmo es la parte de las sesiones inactivas volcado en el disco, y puede incluso ser expulsado de excepción de memoria. Si la sesión es objeto de dumping en el disco, primero debe ser serializado, los costos de racimo a gran escala, un objeto es serializado son muy caros. Por lo tanto, cuando la sesión ya no es necesaria, se debe llamar de inmediato al método HttpSession invalidate () para una conversación clara.

(19) un conjunto de interfaces implementadas acceso aleatorio tales ArrayList, debe ser el uso más común para el lazo de bucle en lugar foreach para iterar

Este es el JDK recomienda al usuario. JDK API de interfaz de acceso aleatorio interpretación son: lograr la interfaz de acceso aleatorio se utiliza para indicar que apoyan el acceso rápido al azar, el objetivo principal de esta interfaz es permitir que los algoritmos genéricos para alterar su comportamiento con el fin de aplicarlo a una listas de acceso aleatorio o secuencial puede proporcionar una buena el rendimiento. muestra la experiencia prácticos acceso aleatorio instancia de clase de interfaz, si un acceso aleatorio usando una eficiencia de ciclo normal será más alto que para el uso de bucle foreach; A la inversa, si el acceso secuencial, el uso de una mayor eficiencia se iterador. Código similar al siguiente se puede determinar:

si (instanceof lista de acceso aleatorio)

{

    for (int i = 0; i <list.size (); i ++) {}

}

más

{

    Iterator iterador = list.iterable () <?>;

    mientras que (iterator.hasNext ()) {iterator.next ()}

}

bucle foreach para lograr el principio subyacente es el iterador iterador. Así que después de la palabra "Por el contrario, si se trata de acceso secuencial, utilice iterador será mayor eficiencia" significa que las instancias de clase de acceso secuencial, utilice un bucle foreach para iterar.

(20) usando un bloque de método de sincronización de sincronización alternativo

Publicado ocho artículos originales · ganado elogios 4 · Vistas 1767

Supongo que te gusta

Origin blog.csdn.net/zprwcc000/article/details/104806802
Recomendado
Clasificación