Estaba hurgando en XNA y vi que la clase Vector3
estaba usando campos públicos en lugar de propiedades. Probé un punto de referencia rápido y descubrí que, para un struct
, la diferencia es bastante dramática (al agregar dos vectores juntos, 100 millones de veces tomaron 2.0 con propiedades y 1.4 con campos). Para un tipo de referencia, la diferencia no parece ser tan grande, pero está allí.¿Por qué los campos públicos son más rápidos que las propiedades?
Entonces, ¿por qué es eso? Sé que una propiedad está compilada en los métodos get_X
y set_X
, que incurriría en una sobrecarga de llamada a un método. Sin embargo, ¿estos simples getters/setters siempre se introducen en el JIT? Sé que no se puede garantizar lo que el JIT decide hacer, pero seguramente esto es bastante alto en la lista de probabilidades. ¿Qué más hay que separa un campo público de una propiedad en el nivel de la máquina?
Y una cosa que me he estado preguntando: ¿cómo es una propiedad auto implementada (public int Foo { get; set; }
) 'mejor' OO-design que un campo público? O mejor dicho: ¿cómo son esos dos diferente? 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 utilizando .NET 3.5 SP1 que creo que los problemas resueltos en métodos con estructuras (o métodos de estructuras, no estoy seguro) no estaban alineados en, por lo que no lo es. 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 corriendo una versión de lanzamiento :)
EDITAR: aprecio los chicos respuestas rápidas, pero indiqué que hago sabiendo que el acceso a la propiedad es una llamada a un método, pero que yo no' t saber por qué, presumiblemente, el método alineado es más lento que el acceso directo al campo.
EDIT 2: Así que creé otra struct
que utiliza GetX explícita() métodos (o cómo no echo de menos mis días Java en absoluto) y que lleva a cabo el mismo si he deshabilitado en-guarnición en ella (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 las estructuras.
Pensé que había excepciones, donde el JIT podría optmize la llamada de método virtual de distancia. ¿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 posible método, ¿no? ¿O es porque puedes implementar una interfaz en él?
Esta es una especie de vergüenza, ya que realmente me hacen pensar acerca del uso de las propiedades en el rendimiento del material crítico, sin embargo, el uso de campos me hace sentir sucia y que también podría escribir lo que estoy haciendo en C
EDIT 3: Encontré this publicando sobre el mismo tema. Su conclusión final es que la llamada a la propiedad se optimizó. También podría haber jurado que he leído muchas veces que las propiedades simples getter/setter se alinearán, a pesar de ser callvirt
en IL. Entonces, ¿me estoy volviendo loco?
EDITAR 4: Reed Copsey registró la respuesta en un comentario a continuación:
Re: Edit3 - ver mi comentario actualización: Creo que esto es JIT x86 vs x64 cuestiones JIT. el JIT en x64 no es tan maduro. Espero que MS mejore esto rápidamente a medida que más sistemas de 64 bits entren en línea 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 realmente impactante para mí, no tenía idea de que vivía en la edad de piedra en mi sistema operativo de 64 bits. Incluiré su comentario en mi respuesta para que se destaque mejor. - JulianR
¡Gracias a todos!
Pregunta: ¿Qué sucede si el campo es público pero también hay una propiedad. ¿Está inline entonces? – Quibblesome
Parece que no, no. – JulianR
Re: Edit3 - ver mi comentario actualizado: Creo que esto es x86 JIT vs x64 JIT problemas. el JIT en x64 no es tan maduro. Espero que MS mejore esto rápidamente a medida que más sistemas de 64 bits entren en línea todos los días. –