CLR: .Net / Mono / Boo / Otros CLR => C# => Mensaje iniciado por: Sined99 en Miércoles 29 de Junio de 2011, 08:05
Título: Duda variables locales eficiencia
Publicado por: Sined99 en Miércoles 29 de Junio de 2011, 08:05
Hola, tengo una duda sobre que sería mas eficiente, tengo un metodo que se ejecuta ciclicamente cada medio segundo, dentro de el, tengo declarado un streamwriter sw=new ...., mi pregunta es ¿si se ejecuta cada X tiempo, ¿es mas conveniente declararlo como un atributo de la clase o dejarlo como variable local dentro de ese metodo?
Un saludo y muchas gracias!
Título: Re: Duda variables locales eficiencia
Publicado por: ProfesorX en Miércoles 29 de Junio de 2011, 16:23
Creo que tu mismo sabes la respuesta, es logico, pero aun asi te la dire.
Es mas eficiente crear tu variable como atributo de la clase, en lugar de crearla dentro del metodo. Recuerda definirla como private o protected si no deseas acceder a ella desde fuera de la clase.
Saludos :)
Título: Re: Duda variables locales eficiencia
Publicado por: gabio2 en Miércoles 29 de Junio de 2011, 16:31
Puedes usarlo como gustes, siempre y cuando liberes los recursos es decir a tu objeto de tipo Stream cuando te termine de servir usar el método Dispose() de tú objeto.
Yo lo haría de esta forma:
1) Declaro mi variable global SIN instanciarla:
Código: C#
StreamWriter sw;
2) Dentro de mi método hago la instancia y cuando termine de usarlo libero los recursos.
Espero te ayude saludos. :) como veo que eres nuevo, te recomiendo que igual te informes un poco usando google. :).. saludos..
Título: Re: Duda variables locales eficiencia
Publicado por: ProfesorX en Miércoles 29 de Junio de 2011, 17:33
Cita de: "gabio2"
Puedes usarlo como gustes, siempre y cuando liberes los recursos es decir a tu objeto de tipo Stream cuando te termine de servir usar el método Dispose() de tú objeto.
Difiero de la respuesta de gabio2, no es necesario usar el dispose de C# en este caso, ya que C# no es como C++, en C# tienes el "recolector de basura" (garbage collector) que automaticamente libera las variables no utilizadas, el problema es que no hay manera de decirle al recolector especificamente que libere la memoria cuando tu lo deseas, aun llamando explicitamente a dispose(), el recolector lo hace cuando lo cosidera necesario, y ademas el problema en este caso no es la memoria, es que creas una variable nueva cada vez, y eso consume tiempo del procesador, aqui hablamos de rapidez, y es mas rapido usar en este caso una variable definida previamente que crear una variable cada vez, si llamaras al metodo pocas veces no importaria, pero dado que comentas que llamas al metodo cada medio segundo eso significa que cada medio segundo creas una variable nueva.
Saludos :)
Título: Re: Duda variables locales eficiencia
Publicado por: gabio2 en Miércoles 29 de Junio de 2011, 17:50
"Un método Dispose debe llamar al método GC.SuppressFinalize del objeto que está desechando. Si el objeto se encuentra en la cola de finalización en ese momento, GC.SuppressFinalize evita que se llame a su método Finalize. Recuerde que ejecutar un método Finalize afecta al rendimiento. Si el método Dispose ya ha limpiado el objeto, no es necesario que el recolector de elementos no utilizados llame al método Finalize del objeto."
Tienes razón automáticamente su "recolector de basura" lo hace, sin embargo no sabes cuando, lo mete en una lista junto las demás en cambio al ejecutar el dispose, lo elimina al momento y si se encuentra en la cola ya no lo ejecuta.. si se refiere a "rápidez y eficacia" para mí eso sería lo mejor.
con respecto a declarar la variable dentro o fuera del método, por las veces y el tiempo en el que se va a ejecutar en ese caso es mejor como Profesor X te dice.. y como te puse en mi ejemplo poner las variables globales. Las variables locales son buenas usarlas cuando el método no se ejecuta tan frecuente, no vale la pena declarar variables Globales que NO se van a usar con la frecuencia que se deberia solo desperdicias memoria.. :).. saludos..
Título: Re: Duda variables locales eficiencia
Publicado por: Sined99 en Jueves 30 de Junio de 2011, 08:06
Hola, muchisimas gracias a todos! por contestar! os hare caso y pondre la variable como propia de la clase, muchisimas gracias!