• Domingo 17 de Noviembre de 2024, 23:44

Autor Tema:  Duda variables locales eficiencia  (Leído 1938 veces)

Sined99

  • Miembro activo
  • **
  • Mensajes: 56
    • Ver Perfil
Duda variables locales eficiencia
« en: Miércoles 29 de Junio de 2011, 08:05 »
0
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!

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Duda variables locales eficiencia
« Respuesta #1 en: Miércoles 29 de Junio de 2011, 16:23 »
0
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 :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

gabio2

  • Miembro MUY activo
  • ***
  • Mensajes: 402
  • Nacionalidad: mx
    • Ver Perfil
Re: Duda variables locales eficiencia
« Respuesta #2 en: Miércoles 29 de Junio de 2011, 16:31 »
0
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#
  1.  
  2. StreamWriter sw;
  3.  
  4.  

2) Dentro de mi método hago la instancia  y cuando termine de usarlo libero los recursos.

Código: C#
  1.  
  2. public bool MiMetodo()
  3. {
  4. sw = new StreamWriter();
  5. //Tú código aquí
  6. // Ya que termine de usarlo:
  7. sw.Dispose();
  8. }
  9.  
  10.  

Espero te ayude saludos. :) como veo que eres nuevo, te recomiendo que igual te informes un poco usando google. :).. saludos..
@gabio87

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Duda variables locales eficiencia
« Respuesta #3 en: Miércoles 29 de Junio de 2011, 17:33 »
0
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 :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

gabio2

  • Miembro MUY activo
  • ***
  • Mensajes: 402
  • Nacionalidad: mx
    • Ver Perfil
Re: Duda variables locales eficiencia
« Respuesta #4 en: Miércoles 29 de Junio de 2011, 17:50 »
0
"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."

http://msdn.microsoft.com/es-es/library ... 80%29.aspx

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..
@gabio87

Sined99

  • Miembro activo
  • **
  • Mensajes: 56
    • Ver Perfil
Re: Duda variables locales eficiencia
« Respuesta #5 en: Jueves 30 de Junio de 2011, 08:06 »
0
Hola, muchisimas gracias a todos! por contestar! os hare caso y pondre la variable como propia de la clase, muchisimas gracias!

Un saludo.