2011-06-20 5 views
6

Uso las API de reflexión como GetType() y GetTypes() en .NET/C#.¿Cómo es el rendimiento de las API de reflexión, como GetType() y GetTypes()?

  • En términos de rendimiento, ¿qué tan buenas o malas son esas API? Quiero decir, ¿estas API tardan mucho tiempo en causar alguna degradación del rendimiento, o estas API están bien diseñadas para ignorar los problemas de rendimiento?
  • ¿Normalmente las personas guardan en caché los resultados cuando usan las API de reflexión?
+0

¿Bueno o malo en relación a qué? –

Respuesta

6

No sabemos qué significa "bueno" y "malo" para usted.

No sabemos si los está utilizando en un código de rendimiento crítico que pueda ser un cuello de botella para su aplicación.

Solo usted conoce exactamente las rutas que su código tomará al usar Object.GetType y Assembly.GetTypes.

Por lo tanto, solo usted puede determinar exactamente qué tan significativo será el uso de estos métodos en el rendimiento de su aplicación, y qué tan beneficioso será tratar de aumentar el rendimiento mediante el almacenamiento en caché.

te puedo decir esto: nunca he tenido Type.GetType y Assembly.GetTypes ser un cuello de botella en mi solicitud, y no almacenar en caché los resultados (He, sin embargo, necesario para almacenar en caché MemberInfo.GetCustomAttributes pero sólo llegó a esa conclusión después de un perfilador me dijo que era un cuello de botella significativo en mi aplicación y que el almacenamiento en caché mejoraría sustancialmente el rendimiento).

respuesta a tu edición:

quiero decir, estas son las API toman mucho tiempo que podría causar una degradación de rendimiento, o son estas API bien diseñados para ignorar los problemas de rendimiento?

¿Qué alternativas tienes? Si necesita una referencia al Type para un objeto determinado, o si necesita todos los tipos en un conjunto determinado, le aseguro que Object.GetType y Assembly.GetTypes son su mejor opción. La pregunta es, ¿cómo los estás usando? Nuevamente, no lo sabemos, y por lo tanto no podemos decirte qué hacer. Tiene que perfilar su uso en el mundo real de estas funciones y averiguar si están causando un cuello de botella en su aplicación o no.

4

Ambos tienen un rendimiento extremadamente bueno y un rendimiento extremadamente bajo. Todo depende de tu perspectiva y comparación.

Reflection API servidor es un propósito y en la mayoría de los usos de esas API no crearán un cuello de botella. Usalos, usalos a ellos.

Si, después de usarlos en gran medida, crean un cuello de botella que se muestra a través del perfilado, existen opciones para mejorar el rendimiento. Puede implementar el almacenamiento en caché por su cuenta, y puede usar el tiempo de ejecución o la generación de código de tiempo de compilación.

La mayoría de los ORM utilizan la reflexión para rellenar objetos de entidades y, dado que esto es algo que se realiza repetidamente en volúmenes muy altos, puede convertirse en el cuello de botella de rendimiento. Algunos microormas más nuevos están utilizando clases generadas en tiempo de ejecución que pueden construir entidades sin reflexión (usando Reflection.Emit). En nuestro proyecto usamos clases generadas en tiempo de compilación para crear constructores para cada entidad. El tiempo de compilación generado es más fácil y tiene el mejor rendimiento si funciona en su situación.

Cuestiones relacionadas