Me he dado cuenta cuando trato con Expresiones o Árboles de expresiones. Estoy usando mucho la reflexión para establecer y obtener valores en las propiedades y lo que tenemos. Se me ha ocurrido que el uso de la reflexión parece ser cada vez más común. Cosas como las anotaciones de datos para la validación, atribuir ORM pesados, etc. Me pregunto: ¿qué ha cambiado desde los días hace años y años cuando solía decirme que evitara la reflexión, si es posible?
¿Y qué, si algo ha cambiado? ¿Es solo la velocidad de las máquinas? ¿Ha habido cambios en el marco para acelerar la reflexión?
¿O realmente nada ha cambiado? ¿Sigue siendo "malo" o "lento" usar la reflexión?
.net
reflection
carne
fuente
fuente
Respuestas:
La reflexión no es mala ni lenta. Es simplemente una herramienta. Como todas las herramientas, es muy valioso para ciertos escenarios, no tan valioso para otros.
Si el rendimiento es realmente un problema, siempre puede usar una biblioteca como FasterFlect .
Lecturas adicionales
Si la reflexión es ineficiente, ¿cuándo es más apropiada?
fuente
dynamic
, aparentemente, un orden de magnitud más rápido que la reflexión.La razón por la que las personas desconfían de usar la reflexión innecesariamente no es el rendimiento: sí, hay algo de sobrecarga para usar la reflexión, pero a menudo, resolver el problema sin ella requiere un enfoque diferente con una complejidad comparable, e incluso si no lo hace, la sobrecarga es rara vez es significativo (especialmente para el desarrollo a nivel de aplicación).
Usando la reflexión, se rompen algunas suposiciones importantes que normalmente se pueden hacer sobre el código fuente, y las herramientas como "Buscar todas las referencias" dejan de funcionar de manera confiable. La reflexión también elimina básicamente la mayor parte de la seguridad de tipo que el compilador impone, por ejemplo, C #, y la mayoría de los errores de programación que un sistema de tipo normalmente detectaría y traduciría en errores del compilador, ahora se convierten en errores de tiempo de ejecución en el mejor de los casos o errores muy oscuros en el peor.
Entonces, ¿por qué la gente usa la reflexión entonces? En pocas palabras, porque a pesar de los problemas descritos anteriormente, es una herramienta muy valiosa. Con la reflexión, algunos de los beneficios de la programación dinámica se pueden obtener en un lenguaje estático, estrictamente tipado como C #, y los lenguajes de programación dinámica han demostrado sus ventajas recientemente, especialmente en el ámbito de la programación web: PHP, Javascript y Python bastante prominente. , todos usan tipeo dinámico y han demostrado ser adecuados para la programación web. Pero dado que el lenguaje sigue siendo C #, puede optar por mantener la mayor parte de su aplicación en un lenguaje estrictamente escrito de OOP, y escribir la pequeña parte donde el comportamiento dinámico realmente marca la diferencia con la reflexión.
Un ejemplo típico es cuando necesita exponer métodos como llamadas de servicio web (usando un protocolo aún no integrado en .NET). El enfoque OOP estrictamente tipificado funciona, pero es demasiado restrictivo y torpe. Pero si usa la reflexión para asignar llamadas a métodos y pares clave / valor a argumentos, puede escribir la plomería para dicho servicio web una vez y luego usarla en cualquier clase que desee.
fuente
La reflexión sigue siendo significativamente más lenta que las llamadas directas. Dos cosas han cambiado:
Juntos, estos dos factores han llevado el costo de la reflexión hasta el punto en el que puede usarlo rutinariamente (cuando sea apropiado desde un punto de vista de mantenimiento) y esperar a que el perfilador le diga si es realmente un cuello de botella (y estar razonablemente seguro de que la mayoría de el tiempo no será).
fuente