2012-04-22 10 views
7

No estoy seguro de si esta pregunta es independiente del idioma o no, así que solo voy a hacer esto como una pregunta de Java. Si tiene un bucle comoEficiencia de crear nuevos objetos en un bucle

for (int i = 0; i < 9; i++) { 
    Object obj = new Object; 
    // fill object 
    // do something with data 
} 

¿Se está creando un nuevo espacio en la memoria en cada iteración del ciclo? Si es así, ¿se está desechando el viejo espacio? Si no es así, ¿es más eficiente para hacer algo como esto

Object obj = new Object; 
for (int i = 0; i < 9; i++) { 
    // fill object 
    // do something with data 
} 

Editar: Actualización de código para ejemplificar mejor la cuestión

+0

No creo que deba crear String en el montón. El mejor enfoque es crear una variable String como String object = null, esto no es más que un puntero a la cadena. Cada vez que está iterando está creando objetos String en el montón y este enfoque es más lento que el anterior. Espero que ayude – allthenutsandbolts

+1

Estos dos bucles hacen cosas completamente diferentes. –

+1

Hay una [pregunta] similar (http://stackoverflow.com/q/8803674/617996) ya ... – PrimosK

Respuesta

9

Respuesta corta: simplemente ignorar esas cosas mientras que el desarrollo en Java, incluso porque la mayoría de estos problemas están enmarcadas en negro y administradas por la propia JVM.

El recolector de basura sabrá qué hacer e intentará hacer lo mejor según la situación.

Además, sus ejemplos específicos no tienen mucho sentido para mí ... ¿podría elaborarlo más?

+0

Supongo que esta misma respuesta no se aplicaría a los idiomas que no tienen recolección de basura como C++ – Steve

+1

No. La misma respuesta se aplica en C++ también. El principio es no optimizar las cosas hasta que tenga una buena evidencia de que vale la pena el esfuerzo. (Desafortunadamente, muchos programadores de C/C++ ignoran este principio ...) –

+0

Cuando dices ignorar cosas, eso significa simplemente colocar la creación del objeto en el ámbito interno más apropiado, como aquí http://stackoverflow.com/questions/8803674/declaring-variables-inside-or-outside-of-a-loop – Steve

1

¿Por qué no ejecuta algunas pruebas y mira los resultados? Es cierto que el recolector de basura funciona, pero no puede saber que funciona de la mejor manera. Al trabajar con grandes porciones de datos, este tipo de cosas puede afectar su eficiencia.

Creo que this link ayudaría a rastrear lo que necesita.

7

La respuesta básica de "dejar que la cifra recolector de basura hacia fuera" es correcto, pero también se debe entender que el efecto de estos 2 estados:

es (1) crear una nueva (vacía) Cadena, y asígnelo a "objeto", seguido de (2) asignar el valor de array[i] a "objeto".

La asignación en (2) sobrescribe lo que hizo en (1), por lo que nunca se utilizó la primera cadena que creó. El recolector de basura finalmente recuperará el almacenamiento, por lo que no tiene que preocuparse de que se pierda, pero sigue siendo una asignación innecesaria; usted podría comenzar con String object = null;

También tenga en cuenta que String s son inmutables en Java, por lo que una vez que se asigna un objeto String no puede cambiar su valor - que puede hacer una variable String se refiere a un nuevo objeto, pero no puedes modificar uno existente.

Cuestiones relacionadas