2009-03-05 10 views
18

Duplicar posible:
How costly is .NET reflection?¿La reflexión realmente ES tan lenta que no debería usarla cuando tenga sentido?

La solución "elegante" a un problem estoy teniendo es el uso de atributos para asociar una clase y sus propiedades con la de otro. El problema es que, para convertirlo en otro, tendría que usar el reflejo. Lo estoy considerando para una aplicación del lado del servidor que se alojará en la nube.

He escuchado muchos rumores de "la reflexión es lenta, no la use", ¿qué tan lento es lento? ¿Es tan intensivo en la CPU que multiplicará tanto mi tiempo de CPU que literalmente pagaré por mi decisión de usar la reflexión en la parte inferior de mi arquitectura en la nube?

Respuesta

28

Sólo en caso de que no se ve la información actualizada sobre la pregunta original: cuando se está reflejando encontrar todos los tipos que apoyan un cierto atributo, tiene una oportunidad perfecta para usar el almacenamiento en caché. Eso significa que no tiene que usar el reflejo más de una vez en el tiempo de ejecución.

Para responder a la pregunta general, la reflexión es más lenta que las llamadas a métodos compilados sin procesar, pero es mucho, mucho más rápido que acceder a una base de datos o al sistema de archivos, y prácticamente todos los servidores web hacen esas cosas todo el tiempo.

+0

Genius (+4 caracteres) –

+2

+1 para el almacenamiento en caché del resultado. Si trata la reflexión de la misma manera que lee la información del sistema de archivos, no se equivocará mucho; hágalo, pero no con más frecuencia de la necesaria. – stevemegson

8

Probablemente ni lo notará. Siempre haga un perfil primero antes de pensar en optimizaciones.

15

Es mucho más rápido que el acceso al sistema de archivos.

Es mucho más rápido que el acceso a la base de datos en la red.

Es mucho más rápido que enviar una respuesta HTTP al navegador.

4

Me he preguntado lo mismo; pero resulta que la reflexión no es tan mala. No puedo encontrar los recursos (intentaré enumerarlos cuando los encuentre), pero creo que recuerdo haber leído que tal vez fue de 2 a 3 veces más lento. 50% o 33% de rápido sigue siendo rápido.

Además, bajo el capó ASP.net webforms y MVC hacen un montón de reflexión, ¿qué tan lenta puede ser realmente?

EDITAR

Aquí es un recurso Recuerdo haber leído: .Net Reflection and Performance

3

Hmm, trato de evitar el reflejo si puedo, pero si tengo que crear una solución, y la reflexión me brinda una forma elegante de resolver el problema, utilizaré la reflexión.

Pero, debe decirse que creo que la reflexión no debe usarse para hacer 'trucos sucios'. En este momento, también estoy trabajando en una solución donde uso atributos personalizados para decorar algunas clases, y sí, tendré que usar la reflexión para saber si una clase/propiedad/lo que sea ha sido decorada por mi personalizada atributo.

También creo que se trata de "¿cuánto se hacen llamadas de reflexión? Si puedo, intento guardar en caché mis resultados. Me gusta, en la solución en la que estoy trabajando: al iniciar la aplicación, inspecciono ciertos tipos en un determinado ensamblaje, si esos tipos han sido decorados con mi atributo y los guardo en un diccionario.

Cuestiones relacionadas