2010-02-12 12 views
8

Estoy trabajando en la creación de mi propio marco DI que crea fábricas delegadas como un ejercicio de aprendizaje. Mi forma de construir delegados mecanografiados es usar expresiones para crear una función que llame a un método estático con referencia a mi contenedor y cualquier parámetro de constructor.¿Qué es lo que es peor: reflexión o boxeo?

Esto arrojó una pregunta interesante con respecto a los tipos de valores. Que es el mas potente:

a) El uso de la reflexión para seleccionar un método genérico estático con el número correcto de parámetros a continuación, utilizar MakeGenericMethod para eliminar los genéricos

b) Ir por objeto la manera antigua params [] y tomar el golpe en el boxeo?

+6

¿Alguna razón por la cual este "ejercicio de aprendizaje" no implica perfilar varias configuraciones para encontrar la solución óptima? ;-) Aún así daré un +1. –

+1

Buen punto, creo que lo haré. –

+1

c) ¿usar una sobrecarga con parámetros genéricos? – herzmeister

Respuesta

16

IME, el tiempo del boxeo no es nada comparado con la reflexión.

3

Supongo que la reflexión sería mucho más lenta, probablemente por órdenes de magintude.

Es bastante fácil de banco, sin embargo, darle una oportunidad y publicar sus resultados :)

3

En este caso, el boxeo será órdenes de magnitud más rápido que la reflexión.

Por supuesto, siempre puede almacenar en caché los resultados de la reflexión.

+1

+1 para la última línea, que se debe enfatizar más. – supercat

1

Si uno tiene que procesar un millón de artículos, boxear cada artículo será menos eficiente que procesarlos sin boxeo, pero será mucho más rápido que utilizar Reflection para procesar el tipo de cada elemento.

Por otro lado, en muchos casos será posible procesar un millón de elementos de algún tipo genérico T mediante el uso de la reflexión una vez, en el tipo de T, para construir un objeto que puede procesar algo de tipo T sin el boxeo, y luego guarde en caché el resultado de eso durante la vida del programa. Así es como funcionan cosas como EqualityComparer<T>.Default. Tal enfoque puede ser más que un orden de magnitud más rápido que boxear cada elemento.

+0

Recuerde, sin embargo, que aún necesitará acceder a su memoria caché de reflexión, muy probablemente a través de un diccionario. No me sorprendería si un poco de boxeo es aún más rápido que esas búsquedas, particularmente si están involucradas las llaves de cuerda (que pueden o no ser el caso). – Timo

2

En general,, diría que incluso si el boxeo hubiera sido más lento (hasta cierto punto no notable), es el camino correcto a seguir. Reflection es una herramienta para facilitar algo de meta-programación: cuando tienes que trabajar un poco sobre el código en sí mismo, y no para facilitar la lógica de negocios de tus aplicaciones, y por lo tanto no debes usarlo sin una buena razón. Un programador debe pensar primero desde el dominio físico. Dicho esto, en su caso, probablemente no importe ya que usted ya está yendo por meta camino Creo que. El uso de object todavía le da tiempo de compilación de seguridad en cierta medida y mejor mantenimiento.

Como han dicho otros, la reflexión es la más lenta aquí (a menos que no caché). Otra cosa que viene a favor del boxeo es que es muy probable que sea boxeo al tratar con la reflexión. La API de reflexión siempre trata con object, por lo que si está recuperando algún valor de instancia, tiene que deshacer la casilla. Del mismo modo, calling GetType on a value type instance first boxes it to object que puede tener que hacer si no tiene el argumento de tipo, pero solo la instancia.

Pero una mejor alternativa es confiar en los genéricos.Algunos patrones agradables están detallados here.

Cuestiones relacionadas