.net performance

En.NET, ¿se optimizarán las llamadas al método vacío?



performance (5)

@Jon Limjap: Ya sabemos que el compilador C # no optimiza los métodos vacíos. Dado que lo que está descompilando con ildasm fue generado por el compilador C # ... no hay ayuda allí.

Dado un cuerpo de método vacío, el JIT optimizará la llamada (sé que el compilador de C # no lo hará). ¿Cómo voy a averiguarlo? ¿Qué herramientas debería usar y dónde debería estar mirando?

Como estoy seguro de que se lo preguntará, la razón del método vacío es una directiva de preprocesador.

@Chris: tiene sentido, pero podría optimizar las llamadas al método. Por lo tanto, el método seguiría existiendo, pero las llamadas estáticas podrían eliminarse (o al menos incluirse ...)

@Jon: Eso solo me dice que el compilador de lenguaje no hace nada. Creo que lo que tengo que hacer es ejecutar mi dll a través de ngen y mirar el conjunto.


En igualdad de condiciones, sí, debería optimizarse. El JIT enumera las funciones cuando corresponde y hay algunas cosas más apropiadas que las funciones vacías :)

Si realmente quiere estar seguro, cambie su método vacío para lanzar una excepción e imprimir el seguimiento de la pila que contiene.


No, los métodos vacíos nunca se optimizan. Aquí hay un par de razones por las cuales:

  • El método podría llamarse desde una clase derivada, quizás en un ensamblaje diferente
  • El método podría llamarse utilizando Reflection (incluso si está marcado como privado)

Editar: Sí, al mirar ese (excelente) código del documento del proyecto, el JITer eliminará las llamadas a los métodos vacíos. Pero los métodos en sí mismos aún se compilarán y formarán parte de tu binario por las razones que enumeré.


Supongo que tu código es como:

void DoSomethingIfCompFlag() { #if COMPILER_FLAG //your code #endif }

Sin embargo, esto no se optimizará:

partial void DoSomethingIfCompFlag(); #if COMPILER_FLAG partial void DoSomethingIfCompFlag() { //your code } #endif

El primer método vacío es parcial, y el compilador C # 3 lo optimizará.

Por cierto: esto es básicamente para lo que son los métodos parciales. Microsoft agregó generadores de código a sus diseñadores Linq que necesitan llamar a métodos que por defecto no hacen nada.

En lugar de forzarte a sobrecargar el método, puedes usar un parcial.

De esta forma, los parciales se optimizan completamente si no se utilizan y no se pierde el rendimiento, en lugar de agregar la sobrecarga de la llamada al método extra vacío.


Este tipo tiene un tratamiento bastante bueno de las optimizaciones de JIT, haga una búsqueda en la página de ''método está vacío'', está a la mitad del artículo -

http://www.codeproject.com/KB/dotnet/JITOptimizations.aspx

Aparentemente, los métodos vacíos se optimizan mediante la inclusión de lo que efectivamente no es código.

@Chris: me doy cuenta de que los métodos seguirán siendo parte del binario y que estas son optimizaciones JIT :-). En una nota semi relacionada, Scott Hanselman tenía un artículo bastante interesante sobre la incorporación en las pilas de llamadas de creación de versiones:

http://www.hanselman.com/blog/ReleaseISNOTDebug64bitOptimizationsAndCMethodInliningInReleaseBuildCallStacks.aspx