c# reflection reflection.emit

c# - Reflexión. Emita mejor que GetValue y SetValue: S



reflection reflection.emit (5)

Me han dicho que use Reflection.Emit en lugar de PropertyInfo.GetValue / SetValue porque es más rápido de esta manera. Pero realmente no sé qué cosas de Reflection.Emit y cómo usarlas para sustituir GetValue y SetValue. Puede alguien ayudarme con esto ?


El propósito de Reflection.Emit es completamente diferente al de PropertyInfo.Get / SetValue. A través de Reflection.Emit, puede emitir directamente el código IL, por ejemplo, en ensamblados compilados dinámicamente, y ejecutar este código. Por supuesto, este código podría acceder a sus propiedades.

Dudo seriamente que esto sea mucho más rápido que utilizar PropertyInfo al final, y tampoco está hecho para este propósito. Podría usar Reflection.Emit como el generador de código para un compilador pequeño, por ejemplo.


Si está recuperando / configurando la misma propiedad muchas veces, entonces usar algo para construir un método de escritura segura será más rápido que la reflexión. Sin embargo, sugeriría usar Delegate.CreateDelegate lugar de Reflection.Emit. Es más fácil hacerlo bien, y aún es increíblemente rápido.

He usado esto en mi implementación de Protocol Buffers y marcó una gran diferencia frente a PropertyInfo.GetValue/SetValue . Sin embargo, como han dicho otros, solo haga esto después de probar que la forma más sencilla es demasiado lenta.

Tengo una publicación en el blog con más detalles si decides ir por la ruta CreateDelegate .


Usar Reflection.Emit parece un poco demasiado "inteligente", así como una optimización prematura. Si crea un perfil de su aplicación y descubre que GetValue / SetValue Reflection es el cuello de botella, podría considerar la optimización, pero probablemente ni siquiera entonces ...


Utilice PropertyInfo.GetValue / SetValue

Si tiene problemas de rendimiento, almacene en caché el objeto PropertyInfo (no llame repetidamente a GetProperty)

Si, y solo si, el uso de la reflexión es el cuello de botella del rendimiento de su aplicación (como se ve en un generador de perfiles) use Delegate.CreateDelegate

Si, y realmente solo si, está absolutamente seguro de que leer / escribir los valores sigue siendo el peor cuello de botella, es hora de comenzar a aprender sobre el divertido mundo de la generación de IL en tiempo de ejecución.

Realmente dudo que valga la pena, cada uno de esos niveles aumenta la complejidad del código más de lo que mejora el rendimiento, hazlo solo si es necesario.

Y si el acceso en tiempo de ejecución a las propiedades es su cuello de botella en el rendimiento, es probable que sea mejor para el tiempo de compilación (es difícil tener tanto un rendimiento genérico como un rendimiento súper alto al mismo tiempo).


Solo una respuesta alternativa; Si desea el rendimiento, pero una API similar, considere HyperDescriptor ; esto utiliza Reflection.Emit debajo (para que no tenga que hacerlo), pero se expone a sí mismo en la API PropertyDescriptor , por lo que solo puede usar:

PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj); props["Name"].SetValue(obj, "Fred"); DateTime dob = (DateTime)props["DateOfBirth"].GetValue(obj);

Una línea de código para habilitarlo, y maneja todo el almacenamiento en caché, etc.