2010-02-16 18 views
41

Supongo que los objetivos public o privatestatic deben tener un uso de memoria reducido, debido al hecho de que solo hay una copia del objetivo estático en la memoria.¿Las funciones estáticas C# funcionan mejor que las funciones no estáticas, más allá del uso reducido de la memoria?

Parece que porque un método es estático que podría hacer que el método sea un punto potencial para una mayor optimización por parte del compilador CLR más allá de lo que es posible con una función no estática. Solo una teoría endeble, así que vine a preguntarles a todos.

Do staticpublic o private métodos proporcionan cualquier beneficio de rendimiento incrementado más allá de la reducción del uso de memoria?

(Nota: No me interesan las respuestas que hablan sobre los problemas de optimización prematura. Ciertamente, ese es un buen consejo que sigo todos los días, pero eso no significa que la optimización no sea necesaria en ocasiones. (¡Doble negativo!). me permito mi curiosidad, al menos)

+3

en C# se llaman Métodos no Funciones :) –

Respuesta

51

de Static Classes and Static Class Members (C# Programming Guide)

una llamada a un método estático genera una instrucción llamada en Microsoft lenguaje intermedio (MSIL), mientras que una llamada a un método de instancia genera a instrucción callvirt, que también comprueba las referencias de un objeto nulo. Sin embargo, la mayoría de las veces la diferencia de rendimiento entre los dos no es significativa.

+13

En arquitecturas modernas, el predictor de bifurcación come la comprobación nula con sobrecarga de casi cero. –

+0

@ 280Z28 Bueno, para ser precisos algunas plataformas modernas (PlayStation 3 hace esto si mi memoria me sirve) eliminar la predicción de bifurcación mejorando mejor el rendimiento por el costo de escribir programas más difícil –

+1

@Rune FS: En ARM, los controles se implementan condicionalmente instrucciones ejecutadas. En la SPU de la Celda, no tiene predicción de bifurcación, pero debido a otras preocupaciones, si planea ejecutar código administrado en la SPU, debería operar principalmente en tipos no nulos. De hecho, escribí un JIT conceptual para la SPU, que se centró en un pequeño número de tipos de datos útiles para la computación de alto rendimiento y dejó de lado las comprobaciones de referencia nulas en tiempo de ejecución a favor del análisis estático (la biblioteca Contracts). –

23

Aparte de lo que dijo astander, su pregunta sugiere una interpretación errónea de lo que hacen los métodos de instancia. Independientemente de si la función es estática o no, solo hay una copia del código de función en la memoria. Se debe llamar a un método no estático a través de un objeto, pero el objeto no tiene su propia copia privada del método. Por lo tanto, el uso de memoria de los métodos estáticos y no estáticos es de hecho idéntico, y como otros han señalado, las características de rendimiento son casi idénticas.

Las variables miembro no estáticas, sin embargo, existen por separado para cada objeto que cree. Pero casi siempre es una pérdida de tiempo preocuparse por el uso de la memoria, a menos que realmente tenga un problema relacionado con la memoria en su programa.

+0

"Independientemente de si la función es estática o no, solo hay una copia del código de función en la memoria". Gracias, no lo sabía con certeza. –

+3

Un método no estático ha pasado 'this' como un parámetro oculto, por lo que alguien podría objetar que usa más espacio de pila. Sin embargo, esto no parece particularmente significativo. –

+1

@Steven: si convertiste el método en estático, necesitaría tener un parámetro 'this' explícito. –

0

MeasureIt para estar seguro, pero a menos que esté creando un clúster de supercomputación de procesamiento de transacciones de gran volumen y alcance mundial, no tendrá una diferencia apreciable.

1

Buenas respuestas: básicamente no importa, que es la respuesta a casi todas las preguntas de este tipo. Incluso si marcó la diferencia: si el tiempo de ejecución de su programa cuesta un dólar, es probable que este tipo de problema cueste una fracción de centavo, y es muy probablemente que hay otras cosas costing a great deal more.

17

Esto es un poco fuera de tema, pero no menos importante.

La elección de los métodos de toma de estática o ejemplo no debe basarse en el tiempo de ejecución (que de todos modos no parece importar). Debería basarse en si el método opera en un objeto. Por ejemplo, todas las matemáticas.* los métodos son estáticos, p. ej. (la mayoría) Los métodos String. * son instancia, ya que operan en una instancia de String. Mi filosofía personal: un buen diseño debe compensar los pocos ciclos que se pueden guardar en otro lugar.

Otra opinión sobre el tema: Recientemente trabajé con un tipo a quien le dijeron que los métodos estáticos son malos porque nos llevan de vuelta a la era oscura de la programación de procedimientos y, por lo tanto, deben evitarse a toda costa. Esto dio como resultado ejemplos extraños de clases que requerían instancias de acceso a métodos que no tenían absolutamente ningún interés en las partes internas del objeto.

Phew, me sentí bien sacar eso de mi hogar.

+6

Regla simple: si un método o propiedad no accede a ningún estado de instancia ('this' y sus miembros), probablemente sea estático. –

+6

-1 porque estoy harto de las personas que tienen preguntas legítimas de optimización/rendimiento simplemente diciéndoles "no lo hagas". A veces las micro-optimizaciones ** no importan. – dsimcha

+0

Ocasionalmente, me gusta usar pequeñas funciones estáticas privadas dentro de clases no estáticas, de modo que pueda saber por la palabra clave que el método no altera directamente las variables de instancia no estáticas. Pero, por lo general, solo agrego la palabra clave estática cuando el método no estaba tocando una variable de instancia para comenzar. –

Cuestiones relacionadas