NHibernate: Cuánto más lento por Reflection?
NHibernate (como muchos frameworks de IoC) tiene un optimizador de reflection para crear objetos, setear y obtener valores de los campos/propiedades (fields/properties). No hay que estar preocupados acerca de esto: NHibernate no está usando Reflection en la manera que la conocemos.
Esto podrÃa ser un buen argumento a la hora de “vender NHibernate” a: nuestro cliente, una CompañÃa o mi jefe. Echemos un vistazo a los resultados de una corrida de un proyecto de consola.

As you can see the use of the reflection optimized is faster than the use of reflection. Obviously direct access is the fastest way, but impossible to use in a ORM like NHibernate (as in many other frameworks).
Como se puede apreciar el uso de reflection con el optimizador es más rápido que el uso normal de reflection. Obviamente el uso de acceso directo a las propiedades es la manera más rápida de hacerlo, pero en un ORM como NHibernate no se puede hacer (como en muchos otros frameworks) por el descubrimiento de nuestros tipos en runtime.
Conclusiones
- Usando el optimizador de reflection hace a nuestra aplicación más rapida que aquella que usa los servicios comunes de reflection.
- El acceso a field (campo) es más rápido que el acceso por properties. Esto puede ser un buen argumento a la hora de elegir tanto si mapear NHibernate usando fields o properties.
- Es obvio, pero lo vamos a nombrar: la manera más rápida de acceder a los objetos es usando acceso directo esto es: no-reflection.
Se puede descargar aqui la aplicación de ejemplo.
Gracias Fabio Maulo por hacer de este ejemplo más lindo. Gracias che !
[...] este post mostraba alguna de las bondades de NHibernate como buen ORM y las optimizaciones que posee a la [...]
Mira vos que chiche interesante!, yo estaba haciendo algo como esto cuando necesitaba performance:
http://www.codeproject.com/KB/cs/FastMethodInvoker.aspx
Pero parece que esta bien encapsulado dentro de NH
Hola Diego, este tipo de técnica no es nueva, muchos frameworks la usan, NHibernate no es la excepción, y la librerÃa que nombras basicamente hace lo mismo (clases más …clase menos), usa Emit para generar IL.
En NHibernate toda esta funcionalidad la pueden encontrar aqui:
https://nhibernate.svn.sourceforge.net/svnroot/nhibernate/trunk/nhibernate/src/NHibernate/Bytecode/
O pueden ver como funciona mirando el código del ejemplo, y asà poderlo usarlo luego en sus aplicaciones donde lo justifique.
Un abrazo