EmitMapper 和TinyMapper 两者简单对比(若转载请注明)

来源:互联网 发布:制造业大数据 编辑:程序博客网 时间:2024/04/30 05:51

前言:

 我们在很多项目场景中使用对象映射工具,那么使用最多的OOM对象工具也就那几个。今天所说的EmitMapper 和TinyMapper 两者的性能都是很高的,相比autoMapper 速度不知道快了多少倍,因为我平时使用的最多EmitMapper,所在业余时间做了一下测试两者对比。

测试数据:10万条和1000万条,分手动,TinyMapper,EmitMapper分别进行测试。22次用例结果:平均值:(注autoMapper不参与,因为笔者认为性能暂时无法和以上相比)

SELECT   TOP (200) typename, AVG(esTime) AS estimedFROM      emitTinyMapperData GROUP BY typenameORDER BY 2

结果显示:

手动生成 458TinyMapper    535EmitMapper    618

数据加大到:1000万条:

手动生成    458TinyMapper    525EmitMapper    593

 

TestModel数据对象(为了方便看就写在一起了):

 1 namespace YGOP.PayCenter.MapperTest 2 { 3     /// <summary> 4     /// 测试对象 5     /// </summary> 6     public class TestModel 7     { 8         public string modelName { get; set; } 9     }10 11     /// <summary>12     /// 测试对象A13     /// </summary>14     public class TestModelA: TestModel15     {16         public string modelNameA { get; set; }17         public int age { get; set; }18         public int sex { get; set; }19         /// <summary>20         /// 注意此处21         /// </summary>22         public OrderItem orderItem { get; set; }23     }24 25     public class TestModelB : TestModel26     {27         public string modelNameB { get; set; }28 29         public long sex { get; set; }30         public int ageB { get; set; }31         /// <summary>32         /// 注意此处33         /// </summary>34         public string  gender { get; set; }35         public string bak { get; set; }36         /// <summary>37         /// 注意此处38         /// </summary>39         public OrderItem2 orderItem2 { get; set; }40 41     }42     /// <summary>43     /// 订单子对象测试44     /// </summary>45     public class OrderItem46     {47         public  string orderId { get;set;}48         public  string subId { get; set; }49 50         public int qty { get; set; }51         public  double price { get; set; }52         public string bak { get; set; }53 54         public string qq { get; set; }55         public  bool isMem { get; set; }56 57     }58 59     /// <summary>60     /// 订单子对象测试61     /// </summary>62     public class OrderItem263     {64         public string orderId { get; set; }65         public string itemId { get; set; }66 67         public string qq { get; set; }68         public int amount { get; set; }69         public decimal unitprice { get; set; }70 71         public bool isMem { get; set; }72 73     }
View Code

测试用例代码:

0.手动生成对象

 1    /// <summary> 2         /// 手工生成对象 3         /// </summary> 4         /// <param name="max"></param> 5         /// <returns></returns> 6         private List<TestModelA> HanderCustomObject(int max= 100000) 7         {  8             List<TestModelA> modelAlist = new List<TestModelA>(); 9         10 11             for (int i = 0; i < max; i++)12             {13                 modelAlist.Add(new TestModelA()14                 {15                     age = i + 10,16                     modelNameA = "测试a" + i,17                     modelName = "测试a" + i,18                     sex = i,19                     orderItem = new OrderItem()20                     {21                         bak = "132" + i,22                         orderId = "orderId" + DateTime.Now.ToString() + i.ToString(),23                         price = i + new Random().Next(20, 100),24                         qty = i,25                         qq = "252445578" + i,26                         subId = "subId" + i27                         ,28                         isMem = i % 2 == 029                     }30                 });31             }32 33             return modelAlist;34 35         }
View Code

1.给 TinyMapper 做对象的关系映射

 1         /// <summary> 2         /// 给 TinyMapper 做对象的关系映射 3         /// </summary> 4         private void InitTinyMapperCustomMapper() 5         { 6  7             TinyMapper.Bind<OrderItem, OrderItem2>(mapconfig2Order => 8             { 9                 mapconfig2Order.Bind(a => a.qty, b => b.amount);10                 mapconfig2Order.Bind(a => a.price, b => b.unitprice);11                 mapconfig2Order.Bind(a => a.subId, b => b.itemId);12                 mapconfig2Order.Bind(a => a.bak, b => b.amount);13             });14 15             TinyMapper.Bind<TestModelA, TestModelB>(mapConfig =>16             {17                 mapConfig.Ignore(src => src.modelName);18                 mapConfig.Bind(a => a.age, b => b.ageB);19                 mapConfig.Bind(a => a.sex, b => b.gender);20                 mapConfig.Bind(a => a.modelNameA, b => b.modelNameB);21                 mapConfig.Bind(a => a.orderItem, b => b.orderItem2);22             });23 24 25 26         }
View Code

2.给EmitMapper 做对象关系的映射

 1        /// <summary> 2         /// 给EmitMapper 做对象关系的映射 3         /// </summary> 4         /// <returns></returns> 5         private IMappingConfigurator InitEmitCustomMapper2() 6         { 7             IMappingConfigurator conf = new DefaultMapConfig().ConvertUsing<TestModelA, TestModelB>( 8            v => new TestModelB() 9            {10                ageB = v.age,11                gender = (v.sex % 2 == 0 ? "" : ""),12                modelNameB = v.modelNameA,13                orderItem2 = new OrderItem2()14                {15                    amount = v.orderItem.qty,16                    itemId = v.orderItem.subId,17                    unitprice = Convert.ToDecimal(v.orderItem.price),18                    qq = v.orderItem.qq,19                    orderId = v.orderItem.orderId,20                    isMem = v.orderItem.isMem21                }22 23            });24 25             return conf;26         }
View Code

3.最终的调用

 1       private void button1_Click(object sender, EventArgs e) 2         { 3             Stopwatch stopwatch = new Stopwatch(); 4             stopwatch.Start(); 5  6             int max = 100000; 7             var modelAlist = HanderCustomObject(); 8             stopwatch.Stop(); 9             string ok1 = string.Format(max + "次,手动生成 所用时间 :{0} 毫秒", stopwatch.ElapsedMilliseconds);10             textBox1.AppendText(ok1 + "\r\n");11             stopwatch.Start();12             InitTinyMapperCustomMapper();13             var ss = TinyMapperHelper.Instance.Convert<List<TestModelA>, List<TestModelB>>(modelAlist);14             stopwatch.Stop();15             string ok = string.Format(max + "次,TinyMapper 所用时间 :{0} 毫秒", stopwatch.ElapsedMilliseconds);16             textBox1.AppendText(ok + "\r\n");17 18             //Thread.Sleep(1000);19             stopwatch.Start();20             var conf= InitEmitCustomMapper2();21             var ccc = EmitMapperHelper.Instance.Convert<List<TestModelA>, List<TestModelB>>(modelAlist, conf);22 23             stopwatch.Stop();24             string ok2 = string.Format(max + "次,EmitMapper 所用时间 :{0} 毫秒", stopwatch.ElapsedMilliseconds);25             textBox1.AppendText(ok2 + "\r\n");26 27             return;28         }
View Code

 

使用22次后,结果

 1 方式/10万次采样    耗时/毫秒 2 手动生成    438 3 TinyMapper    549 4 EmitMapper    681 5 手动生成    428 6 TinyMapper    537 7 EmitMapper    709 8 手动生成    473 9 TinyMapper    53410 EmitMapper    61511 手动生成    46312 TinyMapper    53013 EmitMapper    61714 手动生成    48615 TinyMapper    55016 EmitMapper    64517 手动生成    46518 TinyMapper    55119 EmitMapper    65420 手动生成    45021 TinyMapper    54122 EmitMapper    64123 手动生成    44224 TinyMapper    55125 EmitMapper    67426 手动生成    47727 TinyMapper    54328 EmitMapper    60629 手动生成    45830 TinyMapper    51731 EmitMapper    58432 手动生成    44533 TinyMapper    51234 EmitMapper    55535 手动生成    45636 TinyMapper    52137 EmitMapper    58038 手动生成    47539 TinyMapper    55040 EmitMapper    61341 手动生成    52342 TinyMapper    60343 EmitMapper    67344 手动生成    44045 TinyMapper    50046 EmitMapper    56847 手动生成    45748 TinyMapper    53249 EmitMapper    60750 手动生成    41051 TinyMapper    47252 EmitMapper    55953 手动生成    47754 TinyMapper    53655 EmitMapper    59656 手动生成    44957 TinyMapper    52158 EmitMapper    59559 手动生成    48860 TinyMapper    55461 EmitMapper    64062 手动生成    46363 TinyMapper    52064 EmitMapper    58765 手动生成    43266 TinyMapper    56067 EmitMapper    605
View Code

 

 

 

个人使用总结:

tinyMapper 真的挺快的,EmitMapper 仅比其差了一点点而已(10万-1000万条数据中的映射场景并不多见,70多毫秒也不会太在意)。

因为EmitMapper的作者在2011年就不在维护了,我认为EmitMapper还是够吊的了。

但tinyMapper 刚出来不久,但性能真的是无与伦对的美丽!!赞,希望能作者能改善。

最后给出我心中,以上工具的打分和优点缺点简单评。

 

0 0
原创粉丝点击