发出映射器VS valueinjecter或automapper性能(Emit mapper vs

2019-07-02 12:24发布

我已经花了一些时间比较这三级映射器和有趣的是,为什么emitmapper任何valueinjecter或automapper(最后两个可比的性能)之间这么大的性能diffrenece。 从在emitmapper溶液(百万次迭代)基准测试:

    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次迭代):

    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.0012337

有在第一EMIT映射器试验 - 它是每次创建的,在第二 - 一个映射器,用于所有转化。

考虑到这一点,有结果作为valueinjecter(也作为automapper)中比在比发射映射器100倍慢。 什么是如此巨大的性能差异的原因是什么? 至于我反对的对象映射器不能花那么多时间与手写映射器,因为它是项目的一个瓶颈(如果我们需要映射例如对象的集合)。

在这一刻,我想使用发出映射器,但只有一个原因,我还没有准备好做出决定:发出全部由第一开发者在不支持映射器,但我不知道,这是非常重要的(可能性极低到的一些附加功能要求)。

Answer 1:

究其原因,INT的解释EmitMapper文档 :

它有效地使用的Emit库,就好像这些映射器手写产生在运行时直接在IL映射器。 大多数其他映射器用于映射(或源代码生成)上述反射库。 此外EmitMapper减少装箱拆箱操作和映射期间的额外通话。 例如,它执行用于值类型的类型转换,而不拳击拆箱和嵌套成员转换而不递归(一次通过算法),当它是可能的。

相对于手写代码反射极其缓慢。 EmitMapper相反,比起手写的映射,只有当它发出的启动开销。



文章来源: Emit mapper vs valueinjecter or automapper performance