2009-03-15 8 views
25

¿Existe una penalización por llamar a newInstance() o es el mismo mecanismo? ¿Cuánta sobrecarga tiene any newInstance() sobre la nueva palabra clave *?newInstance() vs new

*: Descontando el hecho de que newInstance() implica el uso de la reflexión.

Respuesta

15

En una prueba real, creando 18129 instancias de una clase a través de "Constuctor.newInstance" pasando 10 argumentos -vs- creando las instancias a través de "nuevo" el programa no tuvo una diferencia mensurable en el tiempo.

Esto no era ningún tipo de punto de referencia micro.

Esto es con JDK 1.6.0_12 en Windows 7 x86 beta.

Teniendo en cuenta que Constructor.newInstance va a ser muy similar a Class.forName.newInstance, diría que la sobrecarga casi no tiene nada que ver con la funcionalidad que se puede obtener usando newInstance sobre new.

Como siempre, debe probarlo usted mismo para ver.

+1

Consulte http://www.ibm.com/developerworks/java/library/j-jtp02225.html ... este tipo de puntos de referencia son muy difíciles de corregir debido a la forma dinámica en que el código es compilado/optimizado por el JVM. – Eddie

+0

Como dije, era un ejemplo del mundo real, no un micro punto de referencia ... – TofuBeer

1

Tenga cuidado con microbenchmarks, pero encontré this blog entry donde alguien descubrió que new era aproximadamente el doble de rápido que newInstance con JDK 1.4. Parece que hay una diferencia, y como se esperaba, la reflexión es más lenta. Sin embargo, parece que la diferencia puede no ser un factor decisivo, según la frecuencia de las nuevas instancias de objetos frente a la cantidad de cálculos que se está realizando.

+0

Reflexión ha gooten rápido con cada versión de Java. – TofuBeer

+0

Sí, de hecho, por eso mencioné el uso de 1.4 en el índice de referencia que encontré. Estoy seguro de que newInstance es aún más lento, pero me sorprendería si fuera una gran diferencia. – Eddie

+0

Llamar a setAccessible (true) en el Constructor debería hacerlo un poco más rápido (pero asegúrese de que aún esté seguro). Por supuesto, sugeriría evitar el reflejo si es posible en cualquier caso. –

-1

Hay una diferencia - en 10 veces. La diferencia absoluta es pequeña, pero si el tiempo acumulado acumulativo de CPU de la aplicación de baja latencia puede ser significativo.

long start, end; 
    int X = 10000000; 
    ArrayList l = new ArrayList(X); 
    start = System.nanoTime(); 
    for(int i = 0; i < X; i++){ 
     String.class.newInstance(); 
    } 
    end = System.nanoTime(); 
    log("T: ", (end - start)/X); 

    l.clear(); 
    start = System.nanoTime(); 
    for(int i = 0; i < X; i++){ 
     new String(); 
    } 
    end = System.nanoTime(); 
    log("T: ", (end - start)/X); 

Salida:

T: 105 
T: 11 

Probado en Xeon W3565 @ 3.2Ghz, Java 1.6

+3

Me gustaría echar un vistazo cuidadoso a este código. Durante el tiempo de ejecución, el optimizador de Java simplemente dejará de ejecutar el nuevo String() porque puede decir que al hacerlo no tendrá efectos secundarios. No hará lo mismo para String.class.newInstance() porque es reflejo y no puede decir si la nueva clase de fábrica de fábrica tiene efectos secundarios. – cmdematos

Cuestiones relacionadas