gpt4 book ai didi

.net - 发射映射器与 valueinjecter 或 automapper 性能

转载 作者:行者123 更新时间:2023-12-03 11:58:49 26 4
gpt4 key购买 nike

我花了一些时间比较这三个映射器,有趣的是为什么 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 倍。如此巨大的性能差异的原因是什么?至于我,对象到对象映射器与手写映射器相比不能花费太多时间,因为它是项目的瓶颈(例如,如果我们需要映射对象集合)。

目前我正在考虑使用发射映射器,但我还没有准备好决定的原因只有一个:第一个开发人员根本不支持发射映射器,但我不确定这是否非常重要(可能性非常低需要一些额外的功能)。

最佳答案

原因在 EmitMapper documentation 中有解释。 :

It effectively uses the Emit library to generate mappers at run-time direct in IL as though these mappers are written by hand. Most other mappers use the Reflection library for mapping (or source code generation). Also EmitMapper minimizes boxing-unboxing operations and additional calls during mapping. For example it performs type conversion for value-types without boxing-unboxing and converts nested members without recursion (one-pass algorithm) when it is possible.



与手写代码相比,反射非常慢。相反,与手写映射相比,EmitMapper 在发射时只有启动开销。

关于.net - 发射映射器与 valueinjecter 或 automapper 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13053590/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com