2010-06-10 11 views
19

Tengo pocos métodos globales declarados en clase pública en mi aplicación web ASP.NET.Static Vs Instance Method Performance C#

tengo costumbre de declarar todos los métodos globales en clase pública en el siguiente formato

public static string MethodName(parameters) { } 

Quiero saber cómo impactaría sobre el punto de vista del rendimiento?

  1. ¿Cuál es mejor? ¿Método estático o no estático?
  2. ¿Por qué es mejor?

http://bytes.com/topic/c-sharp/answers/231701-static-vs-non-static-function-performance#post947244 estados:

porque, métodos estáticos están utilizando cerraduras ser Hilo de seguridad. El siempre hace internamente un Monitor.Entrar() y Monitor.exit() para asegurar Seguridad de subprocesos.

Mientras que http://dotnetperls.com/static-method estados:

métodos estáticos son normalmente más rápido para invocar sobre la pila de llamadas que métodos de instancia. Hay varias razones para esto en el lenguaje de programación C# . Los métodos de instancia realmente usan el puntero de instancia 'this' como el primer parámetro, por lo que un método de instancia tendrá siempre con esa sobrecarga. Los métodos de instancia también se implementan con la instrucción callvirt en el lenguaje intermedio, que impone una ligera sobrecarga . Tenga en cuenta que es poco probable que cambiar sus métodos a métodos estáticos ayude mucho en objetivos ambiciosos de rendimiento, pero puede ayudar un poco y posiblemente conducir a nuevas reducciones.

No estoy seguro de cuál usar?

+0

¿Leyó al final de ese primer enlace? Se vuelve bastante claro, incluso dentro del hilo, que la afirmación sobre el bloqueo automático es falsa. –

Respuesta

42

Sus primeros estados de enlace:

Eso es porque los métodos estáticos están utilizando cerraduras a ser flujos seguros. El siempre lo hacen internamente un Monitor.Enter() y Monitor.exit() para garantizar la seguridad de rosca-

Eso es absolutamente, terriblemente, abominablemente mal.


Si agrega [MethodImpl(MethodImplOptions.Synchronized)] al método, esa declaración se vuelve parcialmente cierta.

Agregar este atributo hará que CLR ajuste los métodos dentro de lock(typeof(YourClass)) y los métodos de instancia dentro de lock(this).

This should be avoided where possible


Su segundo enlace es correcto.
Static methods are a little bit faster than instance methods, porque no tienen un parámetro this (saltándose un cheque NullReferenceException de la instrucción callvirt)

+0

Gracias Eso fue útil. – dotnetguts

+9

+1 para los buenos adjetivos :) – SWeko

5

que tienden a cuidar muy poco sobre el rendimiento en este aspecto. Para qué métodos estáticos son realmente útiles se están aplicando prácticas funcionales. Por ejemplo, si crea un método auxiliar estático privado en su clase de instancia, tendrá la tranquilidad de saber que ese método no puede modificar el estado de la instancia.

+0

Muy buen punto. –

0

Esto es básicamente una opción de diseño. Si tiene una lógica que incluye la creación de una instancia de clase y la actualización de algunas propiedades, vaya por ejemplo, ya que el método estático se compartirá entre las instancias. Si bien tiene algunas funciones de utilidad como hacer alguna manipulación de cadena, crear una cadena de conexión, etc., que no implique la manipulación de objetos, busque el método estático.

2

Yo personalmente siempre elegiría el enfoque que es mejor para lograr su tarea actual y escribir código estable, legible y fácil de mantener.

Existen otras formas de mejorar el rendimiento de su aplicación.

algunos ejemplos:

  • Si desea utilizar un método sencillo varias veces sin generar ejemplares de un objeto cada vez (una función de ayuda) a continuación, utilizar un método estático en una clase estática.

  • Si su método tiene acceso a otras variables en la clase y no es seguro para subprocesos, use la función de miembro.

  • En asp.net si quiere compartir un objeto a través de las sesiones o puede mejorar el rendimiento con un método que almacena el resultado en caché internamente, un método estático también estaría bien.

  • Puede combinar las dos formas y usar el patrón de diseño de fábrica para tener una clase con algunas funciones miembro, pero se asegura de que siempre haya solo una instancia a la vez.

  • veces una función estática puede evitar errores estúpidos o reduce la necesidad de controles adicionales de tiempo de ejecución:

    String.IsNullOrEmpty(thisstringisnull) // returns true 
    thisstringisnull.IsNullOrEmpty() // If Microsoft would have implemented 
               // the method this way you would get a 
               // NullReferenceException 
    

Pero en general, depende totalmente de la tarea actual. No hay una respuesta fácil de "siempre use este enfoque ..." a su pregunta.

+0

Gracias SchlaWiener por responder. Declaro métodos de utilidad que se utilizan muchas veces y son buenos desde un enfoque sostenible, pero me confundí con el bloqueo del método como se menciona en un hilo. – dotnetguts

+0

En realidad, puede tener métodos de extensión que funcionen ahora con valores nulos, por lo que thisstringisnull.IsNullOrEmpty() podría tener sentido. – SWeko

+0

@SWeko: ¿en serio? no sabia sobre eso. ¿Es cierto para cada método de extensión o necesito agregar un código adicional si escribo un método de extensión? –