La creación de objetos es barata, sí, pero a veces no lo suficientemente barata.
Si crea mucho (y me refiero a MUCHO) objetos temporales en rápida sucesión, los costos para el recolector de basura son considerables. Sin embargo, incluso con un buen generador de perfiles, es posible que no vea los costos fácilmente, ya que el recolector de basura hoy en día trabaja en intervalos cortos en lugar de bloquear toda la aplicación por un segundo o dos.
La mayoría de las mejoras de rendimiento que obtuve en mis proyectos provinieron tanto de evitar la creación de objetos como de evitar todo el trabajo (incluida la creación de objetos) a través de un almacenamiento en caché agresivo. No importa cuán grande o pequeño sea el objeto, aún lleva tiempo crearlo y administrar las referencias y las estructuras de pila para él. (Y, por supuesto, la limpieza y el montón-desfragmentación/copia interna también lleva tiempo.)
no partiría ser religioso acerca de evitar la creación de objetos en todo costo, pero si usted ve un patrón de rompecabezas en su memory-profiler, significa que su recolector de basura está en servicio pesado. Y si su recolector de basura usa la CPU, el CPI no está disponible para su aplicación.
En cuanto a la agrupación de objetos: Hacer las cosas bien y no tener fugas de memoria o estados no válidos o pasar más tiempo en la administración de lo que ahorraría es difícil. Entonces nunca usé esa estrategia.
Mi estrategia ha sido simplemente luchar por los objetos inmutables. Las cosas inmutables se pueden almacenar en caché fácilmente y, por lo tanto, ayudan a mantener el sistema simple.
Sin embargo, no importa lo que hagas: asegúrate de verificar primero tus puntos de acceso con un generador de perfiles. La optimización prematura es la raíz de la mayoría de la maldad.
+1 Otro buen fragmento de Bloch (segunda edición) es el artículo 5, "Evita crear objetos innecesarios".Los últimos párrafos de este artículo tienen algunos buenos consejos e información. –
De ese mismo artículo por Bloch: * "Este artículo no debe interpretarse erróneamente como una creación de objeto costosa y debe evitarse. Por el contrario, la creación y recuperación de pequeños objetos cuyos constructores hacen poco trabajo explícito es barata ... "* –