¿Es la agrupación de objetos una técnica en desuso?

59

Estoy muy familiarizado con el concepto de agrupación de objetos y siempre trato de usarlo tanto como sea posible.

Además, siempre pensé que la agrupación de objetos es la norma estándar, ya que he observado que Java, al igual que los otros marcos, usan la agrupación tanto como sea posible.

Recientemente, leí algo que era completamente nuevo (¿y contraintuitivo?) para mí.

La agrupación en realidad empeora el rendimiento del programa, especialmente en aplicaciones concurrentes, y es aconsejable crear una instancia de new objetos, ya que en las JVM más nuevas, la creación de instancias de un objeto es realmente rápida.

Leí esto en el libro: Java Concurrency in Practice

Ahora estoy empezando a pensar si estoy entendiendo mal algo aquí ya que la primera parte del libro aconsejó usar Executors que reutiliza Thread s en lugar de crear nuevas instancias.

¿Entonces la agrupación de objetos se ha desaprobado hoy en día?

    
pregunta user10326 19.10.2011 - 18:15

6 respuestas

70

Está en desuso como técnica general, ya que, como ha notado, la creación y destrucción de objetos de corta duración per se (es decir, asignación de memoria y GC) es extremadamente barata en las JVM modernas. Por lo tanto, lo más probable es que el uso de un conjunto de objetos escritos a mano para sus objetos comunes sea más lento, más complicado y más propenso a errores que el simple new . *

Sin embargo, todavía tiene sus usos, para objetos especiales cuya creación es relativamente costosa, como conexiones DB / red, subprocesos, etc.

* Una vez tuve que mejorar el rendimiento de una aplicación Java de rastreo. La investigación descubrió un intento de usar un grupo de objetos para asignar millones de objetos ... y el tipo inteligente que lo escribió usó un único bloqueo global para hacer que los hilos queden seguros. Reemplazar el grupo por llano new hizo la aplicación 30 veces más rápida.

    
respondido por el Péter Török 19.10.2011 - 18:19
34

La respuesta a la pregunta concreta: '¿Es la agrupación de objetos una técnica en desuso?' es:

No. La agrupación de objetos se usa ampliamente en lugares específicos: agrupación de hilos, agrupación de conexiones de base de datos, etc.

La creación general de objetos nunca ha sido un proceso lento. La agrupación en sí misma consume recursos: memoria y capacidad de procesamiento. Cualquier optimización es una compensación.

La regla es:

¡¡La optimización prematura es mala!

¿Pero cuándo es prematura una optimización dada?

La optimización prematura es cualquier optimización hecha, antes de que haya descubierto un cuello de botella a través de creación de perfiles .

    
respondido por el Boris Yankov 19.10.2011 - 20:28
9

En situaciones en las que desea evitar por completo la recolección de basura, creo que la agrupación de objetos es la única alternativa viable. Entonces no, no es absolutamente una técnica obsoleta.

    
respondido por el Jer 19.10.2011 - 20:57
8
  

Esa agrupación en realidad empeora el rendimiento del programa, especialmente en   aplicaciones concurrentes, y es recomendable instanciar nuevas   objetos en su lugar, ya que en las JVM más recientes, la creación de instancias de un objeto es   muy rápido.

Depende del contexto.

    
respondido por el user204677 01.01.2016 - 10:11
7

Medida

Depende completamente de su caso de uso, el tamaño de sus objetos, su JVM, sus opciones de JVM, qué GC ha habilitado y toda una serie de otros factores.

En resumen: mídelo antes y mídelo después. Suponiendo que está utilizando un marco de agrupación de objetos (como el de Apache), entonces no debería ser demasiado doloroso cambiar entre implementaciones.

Sugerencia de prueba de rendimiento adicional: deje que la JVM se caliente un poco, ejecute las pruebas en una JVM en ejecución varias veces, puede comportarse de manera diferente.

    
respondido por el Martijn Verburg 19.10.2011 - 18:30
5

No sé si hay una tendencia cambiante aquí, pero ciertamente va a ser el caso de que depende . Si su clase de Java está administrando un recurso externo, como una conexión RMI o cargando un archivo de recursos, etc., ciertamente, los costos para la creación de instancias de objetos aún pueden ser altos (¡aunque esos recursos pueden estar agrupados para usted! Como práctica general, estoy de acuerdo con el libro.

    
respondido por el Jeremy 19.10.2011 - 18:21

Lea otras preguntas en las etiquetas