标签: emitmapper

发射映射器与valueinjecter或automapper性能

我花了一些时间比较这三个映射器,有趣的是为什么在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
Run Code Online (Sandbox Code Playgroud)

还有一些来自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
Run Code Online (Sandbox Code Playgroud)

首先发射映射器测试 - 每次创建它,第二次 - 所有转换的一个映射器.

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

此刻我正在考虑使用emit mapper,但只有一个原因我还没准备好决定:首先开发人员根本不支持发射映射器,但我不确定这是非常重要的(非常低的可能性)要求一些额外的功能).

.net performance automapper emitmapper

21
推荐指数
1
解决办法
9417
查看次数

哪个更快:Automapper,Valuinjector或手动映射?每个人的速度到什么程度?

假设我的DAL(ORM等)中有这个对象

public class Student
{
   public string Name {get;set;}
   public string Address {get;set;}
   public string Phone {get;set;}
   public Parent Parent {get;set;}
}
public class Parent
{
   public string Name {get;set;}
   public string Address {get;set;}
   public string Phone {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

我有一个看起来像这样的ViewModel

public class StudentDetailVM
{
   public string Name {get;set;}
   public string Address {get;set;}
   public string Phone {get;set;}

   public string ParentName {get;set;}
   public string ParentPhone {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

在那种情况下,我需要展平对象.我可以使用Automapper,ValueInjector等工具完成此操作,或者我可以手动执行此操作.如果有许多这样的类要处理,这是一项繁琐的工作,但似乎在这三种方法之间存在性能/开发人员效率权衡.

我在寻找指导时使用Automapper VS Valueinjector VS手动映射.我确定手动映射是最快的,但是多少?

  1. 某些场景是否比其他场景慢得多/更快(例如展平等)?

  2. 使用混合方法在层之间映射对象是否有意义?

我问的原因是因为创建了一个名为emitmapper的Codeplex项目来解决automapper中的性能问题,我记得看到一条评论说自动化器可能需要花费0.5毫秒来映射一个大类.(需要参考)

我还记得看过一篇文章,该文章介绍了如果用户在70毫秒内加载,而不是90毫秒或更长时间,他们在网站上停留的可能性会更高.(我也在寻找这个链接).如果automapper消耗了我的大部分页面加载时间,加上网络延迟,那么我发现有可能不使用automapper并为我的高容量页面创建手动类,并坚持使用混合方法.

一句话:我会自己运行测试,但是我不太了解.NET内部结构来创建可以用作可重用指南的准确结果.

.net c# automapper emitmapper valueinjecter

16
推荐指数
1
解决办法
1万
查看次数

.net中的对象复制方法:自动映射器,发射映射器,隐式操作,属性复制

如果有人知道在.NET中执行此操作的更多方法,您对此方法的看法是什么?您选择哪种方法?为什么?

以下是.NET中不同对象复制方式的测试.

与此原始线程相关的测试:如何在c#中使用相同的属性名称将值从类X复制到类Y?

所以,在这里,你可以自己运行它:

static void Main(string[] args)
    {
        Student _student = new Student();
        _student.Id = 1;
        _student.Name = "Timmmmmmmmaaaahhhh";
        _student.Courses = new List<int>();
        _student.Courses.Add(101);
        _student.Courses.Add(121);

        Stopwatch sw = new Stopwatch();

        Mapper.CreateMap<Student, StudentDTO>();            

        StartTest(sw, "Auto Mapper");

        for (int i = 0; i < 1000000; i++)
        {
            StudentDTO dto = Mapper.Map<Student, StudentDTO>(_student);
        }

        StopTest(sw);

        StartTest(sw, "Implicit Operator");

        for (int i = 0; i < 1000000; i++)
        {
            StudentDTO itemT = _student;
        }

        StopTest(sw);

        StartTest(sw, "Property Copy");

        for (int i = …
Run Code Online (Sandbox Code Playgroud)

.net c# automapper emitmapper

12
推荐指数
1
解决办法
4720
查看次数

为什么Emit比Reflection更快

我一直在阅读很多关于发射的内容以及它如何比反射快得多,但却未能找到原因.我理解emit是注入IL代码,但是为什么在进行像ORM这样的属性映射时这比反射更快?

参考这种用例: Emit mapper vs valueinjecter或automapper performance

c# reflection emitmapper

4
推荐指数
1
解决办法
562
查看次数