¿Por qué los campos públicos son más rápidos que las propiedades?

o estaba hurgando en XNA y vi que elVector3 class estaba usando campos públicos en lugar de propiedades. Probé un punto de referencia rápido y descubrí que, para unstruct la diferencia es bastante dramática (agregar dos vectores juntos 100 millones de veces tomó 2.0s con propiedades y 1.4s con campos). Para un tipo de referencia, la diferencia no parece ser tan grande, pero está ahí.

Entonces, ¿por qué es eso? Sé que una propiedad se compila enget_X yset_X métodos, que incurrirían en una sobrecarga de llamadas a métodos. Sin embargo, no estos simples getters / setterssiempr ¿En línea con el JIT? Sé que no puede garantizar lo que el JIT decide hacer, pero seguramente esto es bastante alto en la lista de probabilidades. ¿Qué más hay que separe un campo público de una propiedad a nivel de máquina?

Y una cosa que me he estado preguntando: cómo es una propiedad implementada automáticamente public int Foo { get; set; }) ¿Diseño de OO 'mejor' que un campo público? O mejor dicho: ¿cómo están esos dosdiferent? Sé que convertirlo en una propiedad es más fácil con la reflexión, pero ¿algo más? Apuesto a que la respuesta a ambas preguntas es la misma.

BTW: estoy usando .NET 3.5 SP1, que creo que solucionó problemas donde los métodos con estructuras (o métodosd structs, no estoy seguro) no estaban alineados, así que no es así. Creo que lo estoy usando al menos, ciertamente está instalado pero, de nuevo, estoy usando Vista de 64 bits con SP1 que debería tener DX10.1, excepto que no tengo DX10.1 ..

También: sí, he estado ejecutando una versión de lanzamiento:)

EDITA: Agradezco las respuestas rápidas chicos, pero indiqué que yohace sé que un acceso a la propiedad es una llamada al método, pero que no sé por qué, presumiblemente, el método en línea es más lento que un acceso directo al campo.

EDIT 2: Entonces creé otrastruct que usaba métodos explícitos GetX () (o cómo no extraño mis días de Javaen absolut) y se realizó lo mismo si desactivé el revestimiento en él (a través de[MethodImplAttribute(MethodImplOptions.NoInlining)]) o no, entonces conclusión: los métodos no estáticos aparentemente nunca están en línea, ni siquiera en estructuras.

Pensé que había excepciones, donde el JIT podía optimizar la llamada al método virtual. ¿Por qué no puede suceder esto en estructuras que no conocen herencia y, por lo tanto, una llamada a un método solo puede apuntar a un método posible, verdad? ¿O es porque puedes implementar una interfaz en él?

Esto es una pena, ya que realmente me hará pensar en usar propiedades en cosas críticas de rendimiento, pero usar campos me hace sentir sucio y podría escribir lo que estoy haciendo en C.

EDIT 3: Encontréest publicación sobre exactamente el mismo tema. Su conclusión final es que la llamada de propiedad se optimizó. También podría haber jurado que he leído muchas veces que las simples propiedades getter / setter se alinearán, a pesar de sercallvirt en el IL. ¿Entonces me estoy volviendo loco?

EDIT 4: Reed Copsey publicó la respuesta en un comentario a continuación:

Re: Edit3 - vea mi comentario actualizado: Creo que esto es x86 JIT vs x64 JIT cuestiones. el JIT en x64 no es tan maduro. Esperaría que MS mejore esto rápidamente a medida que más sistemas de 64 bits se conectan todos los días. - Reed Copsey

Y mi respuesta a su respuesta:

Gracias, esta es la respuesta! Intenté forzar una compilación x86 y todos los métodos son igualmente rápidos y mucho más rápidos que el x64. Esto es muy impactante para mí en realidad, no tenía idea de que estaba viviendo en la edad de piedra en mi sistema operativo de 64 bits. Incluiré tu comentario en mi respuesta para que se destaque mejor. - JulianR

¡Gracias a todos

Respuestas a la pregunta(5)

Su respuesta a la pregunta