2010-11-09 121 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