2009-09-30 20 views
14

Si tengo una clase que espero ser utilizado en miles de casos en una aplicación de la memoria sensible, ¿Le ayuda si fuera factor de funcionalidad estática a miembros estáticos?¿Los miembros estáticos ayudan a la eficiencia de la memoria?

Imagino que los métodos estáticos y las variables se almacenan una vez por clase, mientras que para los miembros no estáticos tiene que haber algo almacenado para cada instancia.

Con variables de miembros, parece bastante claro, pero ¿qué tipo de datos se almacenan para los métodos?

Estoy trabajando en Java, pero imagino algunas reglas generales para aplicar en otros entornos administrados (como .NET) también.

Respuesta

17

La única diferencia entre los métodos estáticos y no estáticos (ejemplo) métodos detrás de las escenas es que un parámetro oculto adicional (this) se pasa a los métodos de instancia y que los métodos de instancia podría ser llamado usando un despacho indirecta (si virtuales) No hay espacio de código adicional.

Editar:


Mi respuesta se centró en los métodos, pero en la lectura más cerca veo que la cuestión es más acerca de los datos estáticos. Sí, los datos estáticos en cierto sentido salvarán la memoria ya que solo hay una copia de ella. Por supuesto, si los datos deben ser estática es más una función del significado o uso de los datos, no el ahorro de memoria.

Si necesita tener una gran cantidad de objetos y quiere conservar la memoria, es posible que desee investigar también si se aplica el 'Flyweight' pattern.

+3

No, pero cada vez que creas una instancia de un objeto está asignada a la memoria, con un objeto estático esto nunca sucede porque solo tienes un objeto. –

+0

@Jonas B: su punto es tomado. –

+0

Totalmente bueno, centrándose en los métodos. Creo que tengo los datos estáticos bastante correctos, y, como dices, el significado es más importante allí, de todos modos. –

4

La respuesta simple es sí. Creación de una instancia cada vez que no hay ninguno igual a recrear todo el objeto, los métodos estáticos y variables en general, consume menos memoria dependiendo de la forma en que se utilizan. Por supuesto, si solo necesita crear una instancia en todo su programa, no hay diferencia. Y recuerde que siempre puede pasar instancias como referencias donde no puede tener objetos estáticos y necesita reutilizarlos.

+0

A primera vista, al menos, y hasta que se llame, la única memoria que consume un método estático (o no estático) es su código de implementación. Tener un parámetro 'this' implícito que nunca se use no debe hacer ninguna diferencia en eso: lo que determina el tamaño del código de métodos es la complejidad del método, no si se declara como estático o no. – Steve314

15

La decisión no debe tomarse por razones de eficiencia, debe hacerse por motivos de corrección.

Si la variable representa un valor distinto para cada instancia, debe ser una variable de instancia.

Si su variable es un valor común asociado con el tipo en lugar de una instancia individual del tipo, debe ser una variable estática.

Sin embargo, tiene razón: si tiene una variable estática, no "pagará" con cada instancia. Eso solo agrega una razón adicional para hacer variables estáticas donde no representan parte del estado del objeto.

Cuando se menciona métodos en su pregunta, estás hablando variables locales? Obtendrá un nuevo conjunto de variables locales para cada llamada a método, incluidas las llamadas recursivas. Sin embargo, esto no crea un nuevo conjunto de variables estáticas o de instancia.

+0

Ni siquiera había pensado en las variables locales, para ser sincero. Me preguntaba principalmente qué datos están asociados con los métodos declarados y cómo difieren entre estáticos y no. –

+0

Siempre espero que la corrección me brinde eficiencia a través de los desarrolladores inteligentes de JVM, SO y hardware. ;-) –

3

Si hace que un miembro sea variable estático, ahorrará memoria por instancia (suponiendo que haya más de una instancia), pero la ganancia real es que no tiene que trabajar para mantener todos esos miembros no estáticos consistentes con unos a otros, y no necesita una instancia actual para acceder al miembro estático.

Si comete un método estático, se ahorra unos pocos bytes en la pila para cada llamada anidada (no hay 'esto' parámetro implícito), pero eso es sólo relevante si está haciendo recursividad muy pesada. Por supuesto, si la función necesita saber con qué instancia está tratando, necesitará un parámetro explícito para reemplazar el 'esto' implícito de todos modos, de modo que no gane nada.

No hay costo por instancia para tener un método estático, o para el caso, un método no estático. Los costos ocurren en llamadas.

La verdadera razón para usar un método estático es porque no hay ninguna instancia, al menos cuando llama al método. Por ejemplo, puede usar un método estático para crear e inicializar instancias (uno de los patrones de diseño de "fábrica") o para hacer referencia a una instancia de singleton.

Cuestiones relacionadas