我花了一些时间来比较这三个映射器,有趣的是为什么在emitmapper和任何valueinjecter或者automapper之间有如此大的性能差异(最后两个可以通过性能进行比较)。来自emitmapper解决方案中的基准测试(1000000次迭代):
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
首先发射映射器测试 - 它每次创建,第二次 - 所有转换的一个映射器。
考虑到这一点,使得作为valueinjecter(也作为automapper)的结果比发射映射器的结果慢100倍。这么大的性能差异是什么原因造成的?至于我对象映射器与手写映射器相比不能花费那么多时间,因为它是项目的瓶颈(例如,如果我们需要映射对象的集合)。
此刻我正在考虑使用emit mapper,但只有一个原因我没有准备好决定:首先开发人员根本不支持发射映射器,但我不确定这是非常重要的(要求一些额外功能的可能性非常低。)
答案 0 :(得分:11)
它有效地使用Emit库在运行时直接在IL中生成映射器,就好像这些映射器是手动编写的一样。大多数其他映射器使用Reflection库进行映射(或源代码生成)。此外,EmitMapper在映射期间最小化装箱拆箱操作和其他调用。例如,它在没有装箱拆箱的情况下对值类型执行类型转换,并在可能的情况下转换嵌套成员而不进行递归(一次通过算法)。
与手写代码相比,反射速度极慢。相比,EmitMapper与手写映射相比,在发出时只有启动开销。