2010-11-09 48 views
12

我正在使用Automapper,但我对它印象非常深刻,但我有一个复杂的对象,其中包含许多嵌套集合。我使用的是Telerik OpenAccess,它可以快速返回1400条记录,但是当我将它传递给Automapper时,它减慢到可笑的抓取。这里是我的代码供参考:Automapper在映射1400条记录时运行速度极其缓慢

 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; 

帮助!

+0

哪个AutoMapper的版本您使用的? – 2010-11-09 08:35:44

+0

这是什么荒谬的价值? – Kangkan 2010-11-09 08:47:14

+1

您可能想要使用分析器(即dotTrace)来分析哪部分代码运行缓慢。 – 2010-11-09 08:54:57

回答

11

在我以前的工作中有一个团队也在使用Automapper,但最终他们因性能影响而将其删除。

我认为在这个特定的场景中,最好自己编写映射代码,或者开始逐个替换它们。也许一个映射导致了糟糕的性能?

+4

Automapper是一个漂亮的实用程序,但它比直接映射慢几个数量级。在最近的一个项目中,它似乎比直接映射慢1000多倍。我从来没有看过automapper代码,但怀疑它大量使用反射是性能问题的主要罪魁祸首。对于数据迁移类型的应用程序,直接映射可能是最好的方法。 – 2011-10-26 03:07:11

+1

我可能在这里打马,但她是我的经验。我的团队也停止使用AutoMapper,因为它很难映射双向映射和父/子关系(在因惰性加载而生成的实体框架和动态代理中)。我们也经历了非常缓慢的响应时间,并发现当我们运行一个轮廓仪时,它是我们的主要瓶颈。我们确实看过使用其他映射器,但最终它不是直接使用实体,而是直接将映射处理到我们的DTO。 – DDiVita 2012-03-19 19:11:45

9

我不认为这样的工具是专门为映射如此多的记录而设计的。我认为AutoMapper专为映射View Model而设计,在屏幕上显示1400条记录是不正常的。

+0

我正在使用Telerik Rad网格,声称它可以处理令人讨厌的数据量 – Ryan 2010-11-09 09:48:17

+1

Single viewmodel或(Paged/Limited)列表。映射1400条记录不应该真的发生... – Bertvan 2010-11-09 11:16:32

+1

随着Telerik网格,我认为你可以得到它来加载数据的需求。所以,如果你有50个记录的分页,它只会加载50个,当你进入下一个页面时,它将加载下50个。加载所有的前面并不真正缩放。 – Craig 2010-11-09 11:24:33

12

我以自动映射器为基准。 2.0GHz Xeon的单核心能够在一个小物体(3个物业)上每秒处理85,000幅地图。这比手动复制属性慢60倍。如果您愿意,我可以为您设定其他值。

+0

所以你更喜欢一个一个地写一个自定义映射或者使用一个工具! – Ehsan 2015-02-20 10:36:31

+1

@Ehsan:这取决于,这就是为什么我将我的映射隐藏在界面后面的原因。我的IoC容器大多数时间都会填写AutoMapper,但对于时间要求较高的容器,我会编写一个manu-map并配置要使用的实例。 – 2015-02-23 15:44:39

5

对于那些来到这个以后,AutoMapper 5.x的释放由显著性能的改进,其中,映射速度只比手映射稍慢(1M项):

  • 本机:0.19s
  • AutoMapper :0.49s
  • AutoMapper 4.2.1:29S