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 !

3 comments so far

  1. [...] este post mostraba alguna de las bondades de NHibernate como buen ORM y las optimizaciones que posee a la [...]

  2. Diego Jancic Julio 25, 2008 0:20

    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 :)

  3. Dario Quintana Julio 25, 2008 0:40

    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

Leave a comment

Please be polite and on topic. Your e-mail will never be published.