Costo de performance de ORM

¿Alguien tiene alguna experiencia que indique qué tipo de performance puede esperar un desarrollador al elegir usar un ORM (en Django, RoR, SQLAlechemy, etc.) en SQL y bases de datos diseñadas a mano? Imagino que existen problemas complicados, incluso si la especificación de una database dentro de las restricciones de un ORM aumenta o disminuye las posibilidades de crear una estructura de database eficiente (según el nivel de experiencia del desarrollador) y la cuestión de qué tan bien el desarrollador construye el Consultas basadas en SQL o ORM (nuevamente basadas en su experiencia). Cualquier información con respecto a estos o problemas de performance intrínseco sería realmente interesante para mí.

Mi consejo es que no te preocupes por esto hasta que lo necesites, no optimices prematuramente. Un ORM puede proporcionar muchos beneficios a la velocidad de desarrollo, la legibilidad del código y puede eliminar una gran cantidad de repetición de código. Recomendaría usar uno si hace que su aplicación sea más fácil de desarrollar.

A medida que avanza en el desarrollo, utilice puntos de reference y perfiles para determinar los cuellos de botella en el código y, si es necesario, puede eludir el ORM y utilizar las consultas manuales cuando sean necesarios. Normalmente podrá mejorar la velocidad del ORM utilizando el almacenamiento en caching y los índices de la database (entre otras cosas) y luego podrá decidir dónde se requieren las consultas manuales. En su mayor parte, el performance del ORM probablemente sea aceptable y los beneficios de usarlo superarán con creces el costo de performance.

El performance siempre ha sido una reflexión en la mayoría de los desarrollos / architectures DAL Layer. Creo que es hora de que comencemos a cuestionar el performance de estas herramientas ORM, por la llamada facilidad de desarrollo que prometen:

Las dos áreas más importantes de problemas de performance en ORM son:

  1. Incapacidad para escribir Optimum SQL. Debe utilizar un lenguaje de consulta de objects interpretado en SQL por el marco. Mayormente es un buen SQL, pero a menudo no es el SQL más eficiente.

  2. Reflexión. La mayoría de los frameworks ORM usan Reflection para rellenar objects con Data de la database. Las operaciones de reflexión son costosas y, con el aumento de la carga y los datos, la degradación del performance se vuelve obvia.

Otros problemas de performance que surgen se deben a un layout ineficiente de la database o al layout del model de entidad debido al estrecho acoplamiento de los objects de la entidad a las tablas.

También depende de lo que está usando como ORM. En mi experiencia, Hibernate es un cerdo, en términos de velocidad, uso de resources y time de inicio. LINQ to SQL, por otro lado, es un contenedor SQL extremadamente liviano, cuyo impacto probablemente apenas notará (si es que lo hace).

Esto dependerá mucho de con qué lo compare. El codificador que escribe el código de la mano es un truco total, podría ser una bendición en lugar de un golpe. Claramente, puede ir a la inversa también.

Rendimiento : siempre es pro y contra. Si profundizas en la architecture ORM (mira mi artículo: evita los malos hábitos de ORM ), entonces encontrarás intuitivamente las forms de hacerlo más rápido. Aquí está mi otro artículo sobre cómo hacer EF6x 5 veces más rápido (al less para situaciones de lectura): EF6.x 5 veces más rápido

De todos modos, para un buen performance, incluso con ORM, necesitará crear vistas de bases de datos, índices también para verificar las consultas generadas y ejecutadas por ORM y afinarlas también. La carga ansiosa es imprescindible con ORM.