2010-11-09 16 views
12

Estoy usando AUtomapper, que estoy muy impresionado, sin embargo, tengo un objeto complejo con muchas colecciones anidadas. Estoy usando Telerik OpenAccess y devuelve los 1400 registros rápidamente, pero cuando los paso a Automapper se ralentiza hasta un ridículo rastreo. Aquí está mi código de referencia:Automapper ejecuta extremadamente lento en el mapeo de 1400 registros

 List<DAL.Event> query = httpContext.Events.Where(e => e.Inactive != true && e.Event_Locations != null).ToList(); 
     Mapper.CreateMap<DAL.Event, EventDTO>(); 
     Mapper.CreateMap<DAL.Event_Association, EventAssociationDTO>(); 
     Mapper.CreateMap<DAL.Event_ExecutingUnit, EventExecutingUnitDTO>(); 
     Mapper.CreateMap<DAL.Event_Funding, EventFundingDTO>(); 
     Mapper.CreateMap<DAL.Event_Location, EventLocationDTO>(); 
     Mapper.CreateMap<DAL.Event_Objective, EventObjectiveDTO>(); 
     Mapper.CreateMap<DAL.Event_OSR, EventOSRDTO>(); 
     Mapper.CreateMap<DAL.Event_PaxBreakDown, EventPAXBreakDownDTO>(); 
     Mapper.CreateMap<DAL.Event_RegionalConsideration, EventRegionalConsiderationDTO>(); 
     Mapper.CreateMap<DAL.Event_ReviewStatus, EventReviewStatusDTO>(); 
     Mapper.CreateMap<DAL.Event_SPCalendarClone, EventSPCalendarClonesDTO>(); 
     Mapper.CreateMap<DAL.Event_Task, EventTasksDTO>(); 
     Mapper.CreateMap<DAL.Event_TSO, EventTSOsDTO>(); 
     Mapper.AssertConfigurationIsValid(); 
     Mapper.AllowNullDestinationValues = true; 

     IList<EventDTO> result = Mapper.Map<List<DAL.Event>, List<EventDTO>>(query); 
     return result; 

AYUDA!

+0

¿Qué versión de AutoMapper está usando? –

+0

¿Cuál es ese valor ridículo? – Kangkan

+1

Es posible que desee utilizar un generador de perfiles (es decir, dotTrace) para analizar qué parte del código se está ejecutando lentamente. –

Respuesta

11

Había un equipo en mi trabajo anterior que también usaba Automapper pero al final lo eliminaron por el impacto en el rendimiento.

Creo que en este escenario específico es mejor escribir el código de mapeo usted mismo, o comenzar a reemplazarlos uno por uno. Tal vez un mapeo está causando el mal rendimiento?

+4

Automapper es una utilidad ingeniosa pero es de órdenes mucho más lentos que la asignación directa. En un proyecto reciente, parecía ser más de 1,000 veces más lento que hacer un mapeo directo. Nunca he mirado el código de Automapper, pero sospecho que su gran uso de la reflexión es el principal culpable de los problemas de rendimiento. Para aplicaciones de tipo de migración de datos, el mapeo directo es probablemente el mejor enfoque. –

+1

Puedo estar golpeando al caballo aquí, pero ella es mi experiencia. Mi equipo también dejó de utilizar AutoMapper, porque le resultó difícil mapear asignaciones bi-direccionales y relaciones padre/hijo (en Entity Framework y Dynamic Proxies generados debido a la carga diferida). También experimentamos tiempos de respuesta muy lentos y encontramos que era nuestro cuello de botella principal cuando ejecutamos un perfilador. Revisamos el uso de otros mapeadores, pero al final se ha desactivado para usar entidades directas o manejar las asignaciones directamente a nuestros DTO. – DDiVita

9

No creo que herramientas como esta estén diseñadas para mapear tantos registros. Creo que AutoMapper está diseñado para mapear un Modelo de Vista y no es normal mostrar 1400 registros en la pantalla.

+0

Estoy usando una red Telerik Rad que afirma que puede manejar una cantidad desagradable de datos – Ryan

+1

Modelo de vista única o lista (paginada/limitada). El mapeo de los 1400 registros en realidad no debería estar ocurriendo ... – Bertvan

+1

Con la red Telerik, creo que puede hacer que cargue datos bajo demanda. Por lo tanto, si tiene paginación con 50 registros, solo cargará 50 y cuando pase a la página siguiente, cargará los siguientes 50. Cargar todo por adelantado realmente no se escala. – Craig

12

I benchmarked automapper. Un solo núcleo de 2.0GHz Xeon es capaz de manejar 85,000 mapas por segundo, en un objeto pequeño (3 propiedades). Fue 60 veces más lento que copiar manualmente las propiedades. Si lo desea, puedo comparar otros valores para usted.

+0

¿prefieres escribir un mapeo personalizado uno por uno o usar una herramienta? – Ehsan

+1

@Ehsan: depende, por eso escondo mis asignaciones detrás de una interfaz. Mi contenedor de IoC rellenará AutoMapper la mayor parte del tiempo, pero para los críticos de tiempo escribiré un manu-map y configuraré esa instancia para usar. –

5

Para los que vienen a esto más adelante, la liberación 5.x AutoMapper hecho mejoras significativas en el rendimiento, donde la velocidad de mapeo es sólo ligeramente más lento que el mapeo de mano (artículos 1M):

  • Nativo: 0.19s
  • AutoMapper : 0.49s
  • AutoMapper 4.2.1: 29s
Cuestiones relacionadas