2011-03-02 11 views
5

Tengo un código donde estoy declarando un objeto dentro de un bucle, como:¿Hay alguna ganancia de rendimiento al declarar un objeto fuera del bucle

foreach(...) 
{ 
ClassA clA = new ClassA(); 
clA.item1=1; 
clA.item2=2; 
ClassB.Add(clA); 
} 

Habrá alguna ganancia de rendimiento si modifico el código de la siguiente manera:

ClassA clA; 
foreach(...) 
{ 
clA = new ClassA(); 
clA.item1=1; 
clA.item2=2; 
ClassB.Add(clA); 
} 

Gracias de antemano.

+0

yo no de pensamiento con el fin de que su todavía la creación de un nuevo claseA cada vez. ¿Cuántos bucles estás esperando? ¿Qué hace ClassB.Add? –

+0

posible duplicado de [¿Declarar una variable dentro/fuera de un bucle cambia el rendimiento?] (Http://stackoverflow.com/questions/3388536/wl-declaring-a-variable-inside-outside-a-loop-change- el rendimiento) –

Respuesta

4

No hay ganancia de rendimiento como tal. Solo ayuda a que la variable salga del alcance más tarde que antes.

+1

Exactamente. El .NET GC hará un trabajo adecuado para limpiarlo. :) – FarligOpptreden

+2

Si no usa la variable después del ciclo, el alcance es puramente léxico, es decir. podrías escribir código para usarlo en más lugares. Sin embargo, para fines de CG, no hace ninguna diferencia (al menos en una compilación de Release sin depurador adjunto), GC podría reclamar la memoria tan pronto como termine el ciclo. –

+1

Agregaré lo que dijo @Farlig: el tiempo de ejecución de MICROSOFT verá fácilmente que después del ciclo ya no se usa el clA y lo GC. Esto no está garantizado Un JIT no tan inteligente no podía ver esto (y un JIT aún más estúpido no podía verificar si el clA, si bien se definía en un ámbito interno, no se copiaba externamente y, para estar seguro, no lo marcaba hasta la próxima ejecución del GC Lo escribí de forma complicada. Digamos que hay una lista externa al alcance. Si agrega clA a la lista, la lista la conservará. Si no la agrega, la lista no la conservará. .Un estúpido JIT no pudo verificar esto.) – xanatos

3

El compilador optimizará automáticamente el código para mover la declaración fuera del bucle de todos modos, por lo que no hay nada que ganar haciendo esto.

Por ejemplo

while(...){ 
    int i = 5; 
    ... 
} 

se optimizará ser el compilador en este

int i; 
while(...){ 
    i = 5; 
    ... 
} 
+3

Esos dos no son equivalentes, por cierto: el primero inicializa 'i' a 5 en la parte superior de cada ciclo. Tiene razón acerca de la declaración, solo las muestras de su código son confusas como están. El segundo sería mejor como 'int i; mientras (...) {i = 5; ...} '. – paxdiablo

+0

@pax - Ops! Corregí mi código ahora. Gracias. –

1

La asignación objeto real ocurre con clA = new ClassA(); por lo menos que se puede mover fuera del circuito no obtendrá cualquier ganancia de rendimiento

1

Como todo el mundo ha dicho, no realmente, pero yo todavía cambiar el código para:

foreach(...) 
{ 
ClassB.Add(new ClassA() { item1=1, item2=2 }); 
} 
+0

Sin duda * podrías * hacer eso, pero ¿por qué crees que es preferible? –

+0

Simplemente porque se ve mejor ... (no hay una variable temporal solo para asignar propiedades). Sin embargo, es posible que desee ajustar el espacio en blanco, soy demasiado flojo para embellecer cosas en SO. – Massif

Cuestiones relacionadas