自动映射在映射1400记录时运行速度极慢

Rya*_*yan 11 c# asp.net c#-4.0

我正在使用AUtomapper,但我印象非常深刻,我有一个带有许多嵌套集合的复杂对象.我正在使用Telerik OpenAccess,它会快速返回1400条记录,但是当我将它传递给Automapper时,它会慢慢变成荒谬的爬行.这是我的代码供参考:

        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;
Run Code Online (Sandbox Code Playgroud)

救命!

Bry*_*her 12

我对automapper进行了基准测试.2.0GHz Xeon的单核能够在一个小物体(3个属性)上每秒处理85,000个地图.它比手动复制属性慢60倍.如果您愿意,我可以为您评估其他值.


Ger*_*nck 11

我之前的工作中有一个团队也在使用Automapper,但最终他们因为性能影响而删除了它.

我认为在这个特定情况下,最好自己编写映射代码,或者逐个替换它们.也许一个映射导致性能不佳?

  • Automapper是一个漂亮的实用程序,但它比直接映射慢几个数量级.在最近的一个项目中,它似乎比直接映射慢1000多倍.我从来没有看过自动化代码,但怀疑它大量使用反射是性能问题的罪魁祸首.对于数据迁移类型的应用程序,直接映射可能是最好的方法. (4认同)

Cra*_*aig 9

我不认为像这样的工具是为那么多的记录而设计的.我认为AutoMapper设计用于映射视图模型,在屏幕上显示1400条记录是不正常的.


Jim*_*ard 6

对于那些后来发布的人来说,AutoMapper 5.x版本的性能得到了显着提升,其中映射速度仅略微慢于手绘(1M项):

  • 原生:0.19s
  • AutoMapper:0.49秒
  • AutoMapper 4.2.1:29s