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 }
测试用例代码:
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 }
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 }
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 }
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 }
使用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
个人使用总结:
tinyMapper 真的挺快的,EmitMapper 仅比其差了一点点而已(10万-1000万条数据中的映射场景并不多见,70多毫秒也不会太在意)。
因为EmitMapper的作者在2011年就不在维护了,我认为EmitMapper还是够吊的了。
但tinyMapper 刚出来不久,但性能真的是无与伦对的美丽!!赞,希望能作者能改善。
最后给出我心中,以上工具的打分和优点缺点简单评。
0 0
- EmitMapper 和TinyMapper 两者简单对比(若转载请注明)
- EmitMapper 和TinyMapper 两者简单对比(若转载请注明)
- EmitMapper 和TinyMapper 两者简单对比(若转载请注明)
- EmitMapper 和TinyMapper 两者简单对比(若转载请注明)_0
- 转载请注明出处
- 引用请注明出处和转载请注明出处?我的看法
- 糗事百科出品,转载请注明)
- 转载请注明来自1Vr.Cn
- 尊重原创,转载请注明出处
- 最简单之Java实现冒泡排序、选择排序、插入排序、希尔排序、归并排序和快速排序(转载请注明出处)
- 正式声明:转载本Blog文章请注明原始出处和作者
- 基于RTP的音视频封装和同步方案设计图案【转载请注明出处】
- 我的VIM配置(C/C++和PHP)(转载请注明出处)
- 关于原始输入--XP新技术(原创,转载请注明出处)
- [原创]WCF入门级使用教程(转载请注明出处)
- S3C2450自动升级[原创作品,转载请注明出处]
- S3C2450自动升级[原创作品,转载请注明出处]
- 全新S2SH配置一步一步过程详解 转载请注明
- 算法导论学习笔记(四) 初稿
- windows系统注册dll文件
- iOS常用加密
- 66.[PCL]PCD文件格式
- java生成二维码
- EmitMapper 和TinyMapper 两者简单对比(若转载请注明)
- KnockOutJS入门
- cut命令小结
- hdu5860 Death Sequence
- RecyclerView和ListView的异同
- Android通过Socket方式实现客户端和服务器端通信
- 第一篇博客
- 将Eclipse中的代码提交到github中
- Python Numpy Tutorial 发个Python机器学习入门实例