2009-07-27 7 views
8

¿El tiempo de ejecución de .NET CLR sabe cómo optimizar/obtener getters de propiedades simples en tiempo de ejecución? Por ejemplo:¿El .NET CLR realiza una alineación automática de propiedades?

property int Length { get; set; } 

será este ejecutando la función "Length__get" (la construcción de una pila de ella, saltando para ejecutar el código, etc) una vez que se JIT'd en tiempo de ejecución? ¿O el jitter es inteligente y sabe que esto solo se puede reescribir como acceso de campo de clase?

Respuesta

13

Sí, el CLR indicará eso en casos "normales". Sin embargo, existen algunas situaciones en las que no se incluye , incluido todo lo derivado de MarshalByRefObject (porque podría ser un proxy en tiempo de ejecución).

Las reglas para lo que se inline dependen del CLR exacto que está utilizando - x64 vs x86, versión, etc. propiedades triviales son las mismas probabilidades de ser inline como te aunque :)

(Para alguna razón por la que he visto una propiedad trivial ser más lenta que un acceso de campo para dobles en el pasado ... puede haber algunas restricciones en torno a valores mayores que el tamaño de palabra nativo.)

+0

@Jon, ¿qué quisiste decir con "valores más grandes que el tamaño de palabra nativo"? –

+3

Me refiero a cosas como una larga o doble (cada una de las cuales es de 64 bits) en un procesador de 32 bits. –

+0

Gracias Jon. . –

7

En .NET 2.0, métodos (incluidos propiedad getters/setters) estarían en línea si tuvieran menos de 32 bytes.

El .Net 3.5 JIT'r es un poco más inteligente, por lo que depende. Es certianly podría en línea.

Para un análisis de esto, vea To Inline or not to Inline: That is the question.

+3

Buen enlace. Vance Morrison habla en detalle sobre qué incluye y qué no se incluye en .NET 3.5. –

+1

Dato interesante acerca de más código (generado por línea) que se ejecuta más lento debido a errores de caché L1. – Armentage

Cuestiones relacionadas