AutoMapper和EmitMapper的性能对比

作者: Leowuqunqun | 来源:发表于2016-04-22 19:37 被阅读2080次

    想必大家对[对象映射]并不陌生,本文为你带来AutoMapper和EmitMapper的性能分析,废话不多说,直接上测试代码。

    【1】
     Person person = new Person()
    {
        name = "Leo",
        age = "200",
        address = "asdhkjahsd",
        basePerson = new BasePerson()
        {
            school = "xxx"
        }
    };
    int count = 10000;
    List<PersonA> list = new List<PersonA>();
    Stopwatch watch = new Stopwatch();
    watch.Start();
    for (int i = 0; i < count; i++)
    {
        PersonA personA = ObjectMapperManager.DefaultInstance.GetMapper<Person, PersonA>().Map(person);
        list.Add(personA);
    }
    watch.Stop();
    Console.WriteLine("EmitMapper---");
    Console.WriteLine(watch.Elapsed);
    
    List<PersonA> list1 = new List<PersonA>();
    Stopwatch watch1 = new Stopwatch();
    watch1.Start();
    Mapper.CreateMap<Person, PersonA>();
    
    for (int i = 0; i < count; i++)
    {
        PersonA personA = Mapper.Map<PersonA>(person); ;
        list1.Add(personA);
    }
    watch1.Stop();
    Console.WriteLine("AutoMapper---");
    Console.WriteLine(watch1.Elapsed);
    
    public class Person
    {
         public string name { get; set; }
         public string age { get; set; }
         public string address { get; set; }
         public BasePerson basePerson { get; set; }
     }
     public class PersonA
     {
         public string name { get; set; }
         public string age { get; set; }
         public string address { get; set; }
         public BasePerson basePerson { get; set; }
     }
     public class BasePerson
     {
         public string school { get; set; }
     }
    

    老司机可以直接略过这里,关于这里针对新手多说两句Stopwatch这个类,可能新手对这个类还不太熟悉,会问为什么不使用DateTime类型,使用开始时间和结束时间相减计算最终消耗的时间?
    答:Stopwatch类型属于高精度时间戳,在对测试代码效率这方面精准度比DateTime会好,具体的StopWatch的使用可以自行查阅。

    为了防止Heap扩容/GC带来的误差,一般测4次:
    1.A
    2.B
    3.B
    4.A

    其实还有一种方法,预分配一个很大的对象,强制让Heap扩容 并且让GC阈值增大。
    再通过一个互斥锁去控制多条线程并行的去执行你的代码。
    前提条件是你的CPU有足够的核心数。
    还有不能开超线程

    每个人的测试结果有可能最终都不会相同 受个人电脑配置影响!

    最终测试结果:

    Paste_Image.png Paste_Image.png Paste_Image.png Paste_Image.png

    大家可以明显的看到EmitMapper的性能执行10000次反射大概是AutoMapper的3-4.5倍之间,尤为可惜的是EmitMapper的作者早在2010年已经停止更新,有兴趣的同学可以去CodePlex去下载源码看一下。
    传送门 :http://emitmapper.codeplex.com/

    相关文章

      网友评论

        本文标题:AutoMapper和EmitMapper的性能对比

        本文链接:https://www.haomeiwen.com/subject/erxwlttx.html