2009-03-14 8 views
12

¿Tiene C# acceso en línea a las propiedades? Soy consciente del límite de 32 bytes (¿instrucción?) En el JIT para enlining, pero ¿será en línea propiedades o simplemente llamadas al método puro?¿Tiene C# propiedades en línea?

Respuesta

24

Depende del JIT (el compilador de C# no hace ninguna alineación hasta donde sé), pero creo que el JIT alineará propiedades triviales en la mayoría de los casos.

Nota que voluntad no miembros en línea de los tipos que se derivan de MarshalByRefObject que incluye System.Windows.Forms.Control (a través de System.ComponentModel.Component).

También he visto double campos son menos eficientes cuando se accede a través de propiedades - podría ser que hay algunas sutilezas en torno a eso (debido al uso de registro, etc.).

También tenga en cuenta que los JIT de 64 y 32 bits son diferentes, incluido el tratamiento de lo que se incluye.

EDIT: Acabo de encontrar un 2004 blog entry por David Notario con algo más de información. Sin embargo, eso fue antes de que se enviara 2.0. No me sorprendería ver que al menos algo de había cambiado ahora. Puede ser de interés de todos modos.

EDIT: Another question se refiere a un 2008 Vance Morrison blog entry que proporciona más información. Cosas interesantes.

+0

Merece la pena señalar que una propiedad es un envoltorio alrededor de una o dos funciones (get_Name, set_Name). Entonces, la propiedad en línea es una extensión mínima sobre la función en línea. – Richard

8

Un acceso a la propiedad es simplemente una llamada a un método puro. No hay diferencia en el IL que el compilador emite para un acceso a la propiedad y para una llamada a un método con una firma similar, que de alguna manera responde a su pregunta.

+0

Aunque estoy de acuerdo con el principio general, * hay * una diferencia en IL en el lado * de la propiedad ... el JIT ciertamente puede "saber" que lo que se llama es un miembro de la propiedad, por lo que * podría * decidir no JIT basado en esa información. Sin embargo, sería bastante extraño hacerlo, IMO. –

+0

Sí, los métodos de acceso están marcados con el indicador 'specialname' y sus nombres están estandarizados.OTOH, los métodos que deben recibir tratamiento especial de CLR (como constructores) están marcados con 'rtspecialname', por lo que tratar a los usuarios de manera diferente sería contrario al espíritu del estándar CLI/CLR. –

5

Me tomó un tiempo darme cuenta de que en Visual Studio puede ver el desensamblaje del código administrado, después de que el JIT compila.

¿Por qué no crear una clase con una propiedad de acceso muy simple, ejecutarla en modo de lanzamiento, establecer un punto de interrupción y ver lo que dice el desmontaje?

+3

¿Por qué no nos dice cómo hacerlo si (como usted dice) le tomó un tiempo darse cuenta de eso? –

+0

Simplemente avance o entre en el código y abra la ventana de Desensamblaje. –

+6

Si ejecuta el código de modo de lanzamiento debajo del depurador, ejecutarlo bajo el deugger es probable que deshabilite las optimizaciones de JIT. En su lugar, debe iniciarlo sin el depurador, dejarlo JIT y luego usar el depurador para adjuntarlo al proceso que ya se está ejecutando (y * luego * abrir la ventana de desensamblaje). – ChrisW

4

He publicado una pregunta similar hace poco:

Why are public fields faster than properties?

El problema con la mía era que un campo público fue más rápido que una propiedad porque estoy corriendo Vista de 64 bits y el JIT compilado mi código para También de 64 bits, y mis propiedades fueron no forradas. Obligar al proyecto a compilar para x86 hizo en línea la propiedad y no hubo diferencia de velocidad entre la propiedad y el campo público.

Por lo tanto, el JIT C# 32-bit tiene propiedades en línea, el 64 bits no, ni ningún otro método no estático.

Cuestiones relacionadas