2012-10-24 155 views
21

我花了一些時間比較這三個映射器,並且有趣的是爲什麼如此大的性能在emitmapper和任何valueinjeter或automapper(後兩個可比較的性能)之間存在差異。從在emitmapper溶液基準測試(百萬次迭代):發送映射器vs valueinjecter或自動映射器性能

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 

另外,從valueinjecter一些基準具有添加emitmapper拼命地跑(10000次迭代):

在第一EMIT映射器測試
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.0

那裏 - 它被創建每一次,在第二 - 一個映射器的所有轉換。

考慮到這一點,將結果作爲值注入器(也稱爲自動映射器)比放映映射器的速度低於100倍。性能差異如此巨大的原因是什麼?對於我來說,對象映射器與手寫映射器相比不會花費太多時間,因爲它是項目的瓶頸(例如,如果我們需要映射對象集合)。

在這一刻我正在考慮使用發射mapper,但只有一個原因,我沒有準備好決定:第一個開發人員根本不支持發射mapper,但我不確定這是非常重要的(需要某些附加功能的可能性很低)。

+4

當你不知道測試的內容時,很難從數據中得出結論。 Automapper使用反射來執行初始自動映射,然後緩存結果。如果每次迭代都重複這個部分,它可能表現不佳。如果您展示如何運行測試,您可能會得到更好的答案。 –

+0

我用這個頁面的第二部分作爲基本代碼:http://valueinjecter.codeplex.com/wikipage?title = SmartConventionInjection&referTitle =首頁 第一部分我已經使用了emitmapper主頁中的emitmapper項目的基準項目http://emitmapper.codeplex.com) – Igor

+0

感謝您提供一些基準,使我決定不使用Automapper。它大大減緩了一切。 – Peter

回答

11

原因是INT的EmitMapper documentation解釋說:

,有效使用的Emit庫,就好像這些映射器手寫產生在運行時直接在IL映射器。大多數其他映射器都使用Reflection庫進行映射(或源代碼生成)。此外,EmitMapper在映射期間最小化裝箱拆箱操作和額外呼叫。例如,它可以在沒有裝箱的情況下對值類型進行類型轉換 - 拆箱,並在沒有遞歸的情況下轉換嵌套的成員(單通算法)。

與手寫代碼相比,反射速度非常慢。與手寫映射相比,EmitMapper僅在發射時具有啓動開銷。