2009-10-15 7 views
9

Cuando, si alguna vez, es más rápido pasar argumentos como argumentos a un método estático en lugar de tener el método no estático y acceder a los mismos valores a través de los miembros de la instancia. Supongamos que el método accede a estos miembros de forma solo de lectura.¿Puede hacer un método para mejorar el rendimiento estático y bajo qué circunstancias?

En igualdad de condiciones, llamar a un método estático es slightly faster que llamar a un método de instancia.

En igualdad de condiciones, llamar a un método sin argumentos es un poco más rápido que llamar a uno con argumentos.

considerar:

private Thing _thing; 

void DoTheThing() 
{ 
    _thing.DoIt(); 
} 

Versus este código equivalente:

private Thing _thing; 

// caller's responsibility to pass "_thing" 
static void DoTheThing(Thing thing) 
{ 
    thing.DoIt(); 
} 

No puedo pensar en una situación del mundo real, donde este tipo de optimización se lograsen ningún valor, sino como una experimento de pensamiento (para aquellos a quienes les gusta discutir este tipo de cosas), ¿hay realmente un beneficio, y si es así, cuántos argumentos (de qué tipos, etc.) inclinar la balanza hacia el otro lado?

¿Algún otro factor tendrá en cuenta esto? El método estático accede a _thing como una variable local en lugar de un campo, por ejemplo.

+2

+1 Buena pregunta. Cuando ejecuta Code Analysis en su código en VS obtiene el error CA1822 si sus métodos en su clase pueden marcarse como estáticos. Siempre me molesta, y realmente me pregunto si hay algún beneficio. – BFree

+0

@BFree: si sigues el enlace que incluí en la pregunta, puedes ver que llamar a un método estático es cada vez más rápido. En IL, la persona que llama no tiene que insertar una referencia al objetivo en la pila (el JIT probablemente lo anula), y el EE no tiene que comprobar que este objetivo sea nula. –

+2

Sí, hay una ganancia en el rendimiento, pero es probable que no lo veas hasta que estés llamando al método en un ciclo durante cientos de miles de veces. Optimización prematura. –

Respuesta

6

Hay un posible beneficio rendimiento puedo thnk de (por un método no virtual): el método estático no tiene que probar una referencia de nulidad primero (para lanzar una NullReferenceException en su caso).

Yo no creo que esto actualmente da alguna ventaja, pero es posible. Sin embargo, no estoy seguro de que se aplique en su ejemplo particular, y es difícil ver cómo se aplicaría en cualquier caso en el que realmente quisiera usar el valor.

0

En su caso (supongo que la muestra del código estaría en la clase Thing), estática y no estática no tendrán ninguna diferencia de velocidad. Esto es de su enlace:

  • 0,2 0,2 ​​inline de llamadas estático
  • 0,2 0,2 ​​inline esta llamada inst

Por lo tanto, no tiene sentido en absoluto en lo que es estático para un impulso de velocidad.

También tenga en cuenta que los valores proporcionados en su página vinculada son de .Net 1.1 y están obsoletos.

+0

Un punto interesante, aunque solo se aplica cuando los métodos están en línea. El ejemplo que utilicé probablemente estaría subrayado, pero los métodos más grandes (o aquellos con tipos de valores como argumentos, IIRC) no estarían subrayados, en cuyo caso la llamada estática cuesta 6.1ns y la llamada de instancia cuesta 6.8ns. –

+0

De acuerdo con el enlace que tiene la llamada de instancia sería 6.2ns en lugar de 6.1ns para la estática. Además, no hay números, de hecho supondría que esto sería compensado en exceso por el parámetro adicional, lo que significa que la versión estática es probablemente incluso un poco más lenta. – Foxfire

+0

Solo para aclarar: Es una llamada de esta instancia – Foxfire

0

No estoy seguro de la estática de rendimiento entre los métodos estáticos y métodos de instancia.

Pero creo que debe tomarse la decisión de si lo hace como método estático o como método de instancia en función del diseño del objeto. Si llamando a su método, el estado del objeto no se altera, entonces debe hacer ese método como método estático (método para el tipo, no para una instancia particular del tipo).

Cuestiones relacionadas