variable usar programacion metodos metodo estaticos cuando clases c# performance

usar - static void main c#



¿Los métodos estáticos son más eficientes? (7)

Encuentro que muchos métodos de utilidad que escribo dentro de una clase dada solo necesitan unos pocos miembros de datos en la clase, o ninguno en absoluto. En estos casos, tiendo a escribir esos métodos como métodos estáticos (independientes), pasando directamente los pocos elementos de datos que necesitan.

Si son particularmente generales y lo suficientemente útiles para otras clases, también puedo hacerlas públicas.

En términos de memoria y tiempo, ¿es mejor hacer un método estático?


Hay muchas preguntas de este tipo. ¿Los métodos estáticos son más rápidos / lentos? ¿Las funciones virtuales son más rápidas / lentas? ¿Es i ++ más rápido / lento que ++ i? ¿Es (;;) más rápido / lento que while (verdadero)?

Vale la pena adquirir algún software y afinarlo . Eso le dará una buena idea de los tipos de cosas que realmente afectan el rendimiento del software, en la práctica.

Luego verás que la respuesta a preguntas como esa es (la mayor parte del tiempo) que es insignificante.

Si puedo generalizar, las cosas que hacen que el software sea lento, según mi experiencia, son el uso de líneas de código que parecen inocentes, pero cuyo consumo de tiempo puede ser órdenes de magnitud mayores de lo que podría imaginarse. Ya que parecen inocentes, no se pueden encontrar confiablemente mirando el código. Ejemplos: asignar, inicializar y desasignar repetidamente estructuras de datos grandes solo para asegurarse de que existen. Internacionalizando cuerdas que no necesitan ser. Programación al estilo de notificación que puede convertir una configuración simple de una propiedad en una cascada masiva de llamadas a métodos a través de una gran estructura de datos. Operaciones simples O (n ^ 2) que nunca habrían sido un problema, excepto que n fue grande. Pensar que (a <b) lleva aproximadamente la misma cantidad de tiempo si a y b son ints o clases grandes. Esta "multiplicación del tiempo al parecer inocente" tiene un efecto compuesto sobre múltiples capas de abstracción, por lo que, según mi experiencia, el software de gran tamaño tiende a estar plagado de eso.


Hay poca o ninguna diferencia entre un método estático y un método de instancia no virtual. Este último solo tiene this indicador / referencia como un argumento "oculto". En el código de máquina generado, ambos tipos de llamadas son muy similares.

Un método debe ser estático si no depende de / modifica el objeto.

Los métodos virtuales (reemplazables), por otro lado, requieren que el llamante busque la implementación exacta en el llamado vtable . Además de evitar que el compilador incorpore métodos muy pequeños (los accesores de propiedades simples están en línea muy a menudo) la búsqueda lleva un par de ciclos.

Sin embargo, los métodos virtuales son el tipo de envío dinámico más rápido disponible en C # / en el CLR. Mucho más rápido que los delegados y la reflexión.


La diferencia es despreciable en la mayoría de los casos, pero la estática es más eficiente.

Los siguientes pasos se evitan en una llamada de método estático:

  1. Comprobando que la referencia del objeto (esto) no es nula.
  2. Encontrar el método correcto en la tabla de despacho virtual.
  3. Colocando la referencia del objeto en la pila.

Por lo general, sí, no es necesario pasar la referencia "this". Esa referencia se pasa en el registro ECX por lo que no se requiere espacio de pila adicional. El registro ya está establecido si realiza la llamada desde un método de instancia de la misma clase, no habrá ahorros en absoluto. Pero puede ayudar a aliviar la presión sobre un núcleo de CPU x86 cuando el método está en otra clase, x86 no tiene muchos registros. Ver una mejora de rendimiento medible sería extremadamente raro.

Marcé religiosamente los métodos de una clase que no usan miembros de instancia como estáticos. Valoro el contrato inherente proporcionado por la palabra clave estática: "este método no muta el estado del objeto".


Si va a pasar en la instancia de todos modos ( SomeStaticMethod(obj, "abc", 123); ), entonces no realmente. Solo se podría usar de manera útil un método estático en un escenario sin polimorfismo, y en tales casos es muy probable que cualquier cosa simple , como las propiedades, se haya incorporado de todos modos.

Use los objetos "naturalmente" ( obj.SomeMethod("abc",123); ): mantenga el código simple y el perfil para encontrar problemas de rendimiento. Es muy poco probable que obj.SomeMethod("abc",123); diferencia entre la instancia y la estática, a menos que esté ejecutando algunos. bucles apretados Hay algunos escenarios en los que podría importar, pero son bastante especializados.


Debe hacer un método estático si no requiere ninguna información de estado de la clase de la que forma parte.

Si no te importa el polimorfismo , puedes escribir cualquier método como instancia o estática simplemente decidiendo si tomar miembros de la clase y pasarlos al método como argumentos. Lo que debe considerar es si la sintaxis es natural, si el código es fácil de entender y significativo, y así sucesivamente.

Probablemente no debería preocuparse por la optimización a este nivel, porque la sobrecarga de rendimiento de un método de instancia contra estático es despreciable. Sí, hay algo de espacio utilizado en la tabla de despacho para el tipo (si el método es virtual), pero es una sobrecarga pequeña y constante. Sí, también hay una pequeña sobrecarga al invocar un método de instancia en lugar de un método estático, pero nuevamente es pequeño.

Esto parece un nivel de microoptimización, que a menos que tenga evidencia tangible y tangible que pueda creer que realmente afecta el rendimiento del programa, debe evitarlo. De hecho, si hace las cosas mal, el costo de pasar parámetros adicionales (copiarlos en la pila, etc.) en lugar de acceder a ellos a través de la referencia oculta de su tipo, puede resultar en un peor desempeño.

Es mejor analizar la semántica del método y tomar la decisión estática / instancia sobre esa base.