2010-07-09 9 views
11

Escucho de otro desarrollador que un objeto es demasiado caro para crear instancias repetidamente porque "tiene varios métodos".¿Hay un costo por método para crear objetos en Java?

Mi comprensión (de Bloch, en su mayoría) fue que la creación de objetos es costosa principalmente a través de cosas hechas explícitamente en el constructor, especialmente la creación de otros objetos caros.

¿Hay un costo por método para un objeto nuevo en Java? Estoy pensando que no, pero necesito referencias si alguien las tiene.

Gracias!

+3

Sugiero hacer una clase que no tenga métodos y otra que tenga 100 métodos, luego cronometrando cuánto tiempo se tarda en crear una instancia de cada uno un millón de veces más o menos. Entonces hazlo varias veces más para asegurarte. (Mi respuesta instintiva sería que no, los métodos no hacen la diferencia, pero no crean mi palabra). –

+0

Necesito crear algunos probadores de tiempo para este tipo de cosas. ¿Ya hay alguno por ahí? Otra pregunta de SO ... – orbfish

Respuesta

11

Muchos métodos significan un gran virtual method table (VMT). Sin embargo, el VMT es por clase como los metadatos y, por lo tanto, solo tiene como máximo un costo único en la primera instanciación. Las instancias posteriores son tan rápidas como los objetos con menos métodos, suponiendo que los constructores no realicen trabajos pesados.

Vale la pena leer también es el capítulo sobre object creation from the performance tuning book.

+2

* "... solo tienen como máximo un costo por única vez en la primera instanciación" *. En realidad, el costo se incurre en el tiempo de carga de la clase. –

+0

Gracias por la respuesta. El libro parece un poco desactualizado, pero estoy echando un vistazo. – orbfish

+0

@Stephen C, eso podría depender de la VM utilizada y de cómo funciona el JIT. Es por eso que escribí "a lo sumo" - puede cargar las clases de forma perezosa, y la clase puede cargarse bastante tarde, básicamente desencadenada por su creación de instancias. – Lucero

3

No, no hay relación entre el número de métodos en una clase y el tiempo para que la JVM realice una operación new.

En serio, si estás pensando en este tipo de nivel no deberías estar usando un lenguaje como Java, ve y escribe tu aplicación en ensamblador o 'C'.

La verdad es que debe concentrarse en el diseño de sus algoritmos y estructuras de datos, estos tendrán un efecto mucho más profundo en el rendimiento de sus aplicaciones que cualquier optimización de micro potencial.

+2

+1 para resaltar que si crees que el rendimiento de la creación de objetos es un problema, no deberías usar java ... –

+3

Si lees detenidamente mi pregunta, verás que no soy el que "piensa en este nivel" - Intento crear un buen diseño, pero me topa con una resistencia basada en reclamos infundados. Insulto no apreciado – orbfish

+1

@inflagranti FYI hay un capítulo entero en el libro al que se hace referencia anteriormente, y también en Java efectivo. Te dejaré ir a decirle a los autores que no deberían usar Java;) – orbfish

1

Como un lado, habría un pequeño golpe de rendimiento para una clase con muchas variables de instancia (sin embargo, no estoy seguro de que realmente pueda medirse). Java requiere que cada variable de instancia se establezca en 0, falsa, nula para cada instancia nueva y que haya un costo de tiempo de ejecución asociado con establecerlas en cero. Sin embargo, probablemente sea solo un memset (o calloc o algo así) que se complete rápidamente.

0

Necesito referencias, si alguien las tiene.

que sugieren que es el otro desarrollador que se les debe pedir referencias para apoyar su afirmación ridícula.

+0

Acabo de comenzar aquí. Tal vez a tiempo ... – orbfish

+1

Simplemente juega tonto. Diga '¿De verdad? ¿Dónde dice eso? ¿Cómo podría funcionar eso? ¿Por qué un método adicional costaría más en el momento de la instanciación del objeto? – EJP

Cuestiones relacionadas