2010-08-04 12 views
5

En C#, ¿habría alguna diferencia en el rendimiento al comparar las siguientes TRES alternativas?declarará las variables dentro de los subbloques mejorar el rendimiento?

UNO

void ONE(int x) { 

if (x == 10) 
{ 
    int y = 20; 
    int z = 30; 
    // do other stuff 
} else { 
    // do other stuff 
} 
} 

DOS

void TWO(int x) { 

int y; 
int z; 

if (x == 10) 
{ 
    y = 20; 
    z = 30; 
    // do other stuff 
} else { 
    // do other stuff 
} 
} 

TRES

void THREE(int x) { 

int y = 20; 
int z = 30; 

if (x == 10) 
{ 
    // do other stuff 
} else { 
    // do other stuff 
} 
} 
+3

No.usted se está preocupando por lo que se denomina una "micro-optimización": ¿ha realizado una evaluación comparativa para determinar si realmente tiene un problema de rendimiento? –

+0

@Mitch: no veo en ninguna parte de la publicación de Craig una queja por tener un bajo rendimiento en su código. Tenía una pregunta perfectamente válida e inteligente que hacer, y así lo hizo. Es como si no pudiéramos publicar nada @SO que implique rendimiento. –

+2

Ni siquiera llamaría a esta micro-optimización, sino a nano-optimización. Cualquiera que haya visto el resultado de un generador de perfiles sabe que preocuparse por el tiempo que lleva almacenar una variable o llamar a una función es ridículamente insignificante. –

Respuesta

4

todo lo demás igual (y por lo general no son, por lo que normalmente tiene que probar que realmente), ONE() y TWO() debe generar las mismas instrucciones IL Desde variables locales terminan como alcance la método completo. THREE() será insignificante más lento si x==10 ya que los otros dos no se molestarán en almacenar los valores en las variables locales.

Los tres ocupan la misma cantidad de memoria: la memoria para todas las variables se asigna incluso si no hay nada almacenado en ellas. El compilador JIT puede realizar una optimización aquí, sin embargo, si alguna vez busca variables no utilizadas.

+0

+1 para ONE y TWO generando la misma IL. El alcance del nivel de método en C#/CLR es un poco astuto, especialmente para los programadores de C++. –

+0

¿el compilador aún asignará memoria en la opción UNO cuando x! = 10? – CJ7

+0

@Craig, sí, ya que no hay manera de saber si x! = 10 hasta que se evalúa realmente después de que se ha configurado la llamada a la función (que incluye la asignación de memoria para las variables). –

1

No hay diferencia de rendimiento, pero eres ir para encontrar problemas de alcance variable entre cada uno de esos ejemplos.

También está mostrando tres intentos diferentes entre esos ejemplos, que no es lo que quiere:

  1. Y y Z se limita al ámbito de la instrucción if.

  2. yyz se usan fuera de la instrucción if, pero se configuran condicionalmente.

  3. y y z no tienen nada que ver con la declaración if en absoluto.

+0

¿por qué no hay diferencia de rendimiento? – CJ7

0

No creo que haga mucha diferencia. El único momento en que debería preocuparse es si la creación del nuevo objeto y la inicialización es costosa. Siempre puedes tratar de perfilar cada método un par de miles de veces para ver si hay alguna diferencia, pero dudo que encuentres alguna.

La única vez que muevo una declaración más lejos de donde se usa es si se trabajará en un bucle. ej .:

void RunMethod() { 
    FormRepresentation formRep = null; 
    for (int idx = 0; idx < 10; idx++) { 
    formRep = new FormRepresentation(); 
    // do something 
    } 
} 

En realidad, no hay ninguna diferencia ya que aún se está creando el objeto, pero, para mí, se ve más limpio. La otra cosa que debes tener en cuenta es el alcance de la variable. Las variables declaradas no se pueden usar fuera del ámbito en el que se declararon.

1

Por supuesto, debe siempre seleccionar UNA, es mucho más legible. Que sea más rápido en una fracción de nanosegundo no es un accidente, a menudo es un código legible.

Cuestiones relacionadas