2012-10-24 119 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仅在发射时具有启动开销。