.net - Emit mapper vs valueinjecter o automapper performance
emitmapper (1)
El motivo se explica en la documentación de EmitMapper :
Utiliza efectivamente la biblioteca Emit para generar mapeadores en tiempo de ejecución directo en IL como si estos mapeadores estuvieran escritos a mano. La mayoría de los otros mapeadores usan la biblioteca de Reflection para mapear (o generación de código fuente). También EmitMapper minimiza las operaciones de boxeo-desempaquetado y llamadas adicionales durante el mapeo. Por ejemplo, realiza conversión de tipo para tipos de valor sin boxeo-unboxing y convierte miembros anidados sin recursión (algoritmo de una pasada) cuando es posible.
La reflexión es extremadamente lenta en comparación con el código manuscrito. En su lugar, EmitMapper, en comparación con la asignación manuscrita, tiene solo la sobrecarga de inicio cuando se emite.
He pasado algo de tiempo comparando estos tres mapeadores y es interesante por qué la gran diferencia de rendimiento entre emitmapper y cualquiera de valueinjecter o automapper (los dos últimos comparables por rendimiento). Desde la prueba de referencia en la solución emitmapper (1000000 iteraciones):
Auto Mapper (simple): 38483 milliseconds
Emit Mapper (simple): 118 milliseconds
Handwritten Mapper (simple): 37 milliseconds
Auto Mapper (Nested): 53800 milliseconds
Emit Mapper (Nested): 130 milliseconds
Handwritten Mapper (Nested): 128 milliseconds
Auto Mapper (Custom): 49587 milliseconds
Emit Mapper (Custom): 231 milliseconds
También algunos puntos de referencia de valueinjecter ejecutados con emitmapper agregado (para 10000 iteraciones):
Convention: 00:00:00.5016074
Automapper: 00:00:00.1992945
Smart convention: 00:00:00.2132185
Emit mapper(each time new mapper): 00:00:00.1168676
Emit mapper(one mapper): 00:00:00.0012337
Allí, en la primera prueba del asignador de emisiones, se creó cada vez, en el segundo: un asignador para todas las conversiones.
Teniendo esto en cuenta, el resultado es un valor (valor del valor del objeto) (también el de autómata) más lento que en 100 veces que el asignador de emisiones. ¿Cuál es la razón de tan enorme diferencia de rendimiento? En cuanto a mí, el mapeador objeto a objeto no puede tomar tanto tiempo en comparación con el mapeador manuscrito, ya que es un cuello de botella del proyecto (si necesitamos mapear una colección de objetos, por ejemplo).
En este momento estoy pensando en utilizar el asignador de emisión, pero solo hay una razón por la que no estoy listo para decidir: el primer asignador de emisión no es compatible en absoluto con los primeros desarrolladores, pero no estoy seguro de que esto sea muy importante (posibilidad muy baja) a requerimiento de alguna funcionalidad adicional).