前言:

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

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

SELECT   TOP (200) typename, AVG(esTime) AS estimed
FROM emitTinyMapperData
GROUP BY typename
ORDER BY 2

结果显示:

手动生成 458
TinyMapper 535
EmitMapper 618

数据加大到:1000万条:

手动生成    458
TinyMapper 525
EmitMapper 593

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

 namespace YGOP.PayCenter.MapperTest
{
/// <summary>
/// 测试对象
/// </summary>
public class TestModel
{
public string modelName { get; set; }
} /// <summary>
/// 测试对象A
/// </summary>
public class TestModelA: TestModel
{
public string modelNameA { get; set; }
public int age { get; set; }
public int sex { get; set; }
/// <summary>
/// 注意此处
/// </summary>
public OrderItem orderItem { get; set; }
} public class TestModelB : TestModel
{
public string modelNameB { get; set; } public long sex { get; set; }
public int ageB { get; set; }
/// <summary>
/// 注意此处
/// </summary>
public string gender { get; set; }
public string bak { get; set; }
/// <summary>
/// 注意此处
/// </summary>
public OrderItem2 orderItem2 { get; set; } }
/// <summary>
/// 订单子对象测试
/// </summary>
public class OrderItem
{
public string orderId { get;set;}
public string subId { get; set; } public int qty { get; set; }
public double price { get; set; }
public string bak { get; set; } public string qq { get; set; }
public bool isMem { get; set; } } /// <summary>
/// 订单子对象测试
/// </summary>
public class OrderItem2
{
public string orderId { get; set; }
public string itemId { get; set; } public string qq { get; set; }
public int amount { get; set; }
public decimal unitprice { get; set; } public bool isMem { get; set; } }

测试用例代码:

0.手动生成对象

    /// <summary>
/// 手工生成对象
/// </summary>
/// <param name="max"></param>
/// <returns></returns>
private List<TestModelA> HanderCustomObject(int max= )
{
List<TestModelA> modelAlist = new List<TestModelA>(); for (int i = ; i < max; i++)
{
modelAlist.Add(new TestModelA()
{
age = i + ,
modelNameA = "测试a" + i,
modelName = "测试a" + i,
sex = i,
orderItem = new OrderItem()
{
bak = "" + i,
orderId = "orderId" + DateTime.Now.ToString() + i.ToString(),
price = i + new Random().Next(, ),
qty = i,
qq = "" + i,
subId = "subId" + i
,
isMem = i % ==
}
});
} return modelAlist; }

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

         /// <summary>
/// 给 TinyMapper 做对象的关系映射
/// </summary>
private void InitTinyMapperCustomMapper()
{ TinyMapper.Bind<OrderItem, OrderItem2>(mapconfig2Order =>
{
mapconfig2Order.Bind(a => a.qty, b => b.amount);
mapconfig2Order.Bind(a => a.price, b => b.unitprice);
mapconfig2Order.Bind(a => a.subId, b => b.itemId);
mapconfig2Order.Bind(a => a.bak, b => b.amount);
}); TinyMapper.Bind<TestModelA, TestModelB>(mapConfig =>
{
mapConfig.Ignore(src => src.modelName);
mapConfig.Bind(a => a.age, b => b.ageB);
mapConfig.Bind(a => a.sex, b => b.gender);
mapConfig.Bind(a => a.modelNameA, b => b.modelNameB);
mapConfig.Bind(a => a.orderItem, b => b.orderItem2);
}); }

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

        /// <summary>
/// 给EmitMapper 做对象关系的映射
/// </summary>
/// <returns></returns>
private IMappingConfigurator InitEmitCustomMapper2()
{
IMappingConfigurator conf = new DefaultMapConfig().ConvertUsing<TestModelA, TestModelB>(
v => new TestModelB()
{
ageB = v.age,
gender = (v.sex % == ? "男" : "女"),
modelNameB = v.modelNameA,
orderItem2 = new OrderItem2()
{
amount = v.orderItem.qty,
itemId = v.orderItem.subId,
unitprice = Convert.ToDecimal(v.orderItem.price),
qq = v.orderItem.qq,
orderId = v.orderItem.orderId,
isMem = v.orderItem.isMem
} }); return conf;
}

3.最终的调用

       private void button1_Click(object sender, EventArgs e)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start(); int max = ;
var modelAlist = HanderCustomObject();
stopwatch.Stop();
string ok1 = string.Format(max + "次,手动生成 所用时间 :{0} 毫秒", stopwatch.ElapsedMilliseconds);
textBox1.AppendText(ok1 + "\r\n");
stopwatch.Start();
InitTinyMapperCustomMapper();
var ss = TinyMapperHelper.Instance.Convert<List<TestModelA>, List<TestModelB>>(modelAlist);
stopwatch.Stop();
string ok = string.Format(max + "次,TinyMapper 所用时间 :{0} 毫秒", stopwatch.ElapsedMilliseconds);
textBox1.AppendText(ok + "\r\n"); //Thread.Sleep(1000);
stopwatch.Start();
var conf= InitEmitCustomMapper2();
var ccc = EmitMapperHelper.Instance.Convert<List<TestModelA>, List<TestModelB>>(modelAlist, conf); stopwatch.Stop();
string ok2 = string.Format(max + "次,EmitMapper 所用时间 :{0} 毫秒", stopwatch.ElapsedMilliseconds);
textBox1.AppendText(ok2 + "\r\n"); return;
}

使用22次后,结果

 方式/10万次采样    耗时/毫秒
手动生成
TinyMapper
EmitMapper
手动生成
TinyMapper
EmitMapper
手动生成
TinyMapper
EmitMapper
手动生成
TinyMapper
EmitMapper
手动生成
TinyMapper
EmitMapper
手动生成
TinyMapper
EmitMapper
手动生成
TinyMapper
EmitMapper
手动生成
TinyMapper
EmitMapper
手动生成
TinyMapper
EmitMapper
手动生成
TinyMapper
EmitMapper
手动生成
TinyMapper
EmitMapper
手动生成
TinyMapper
EmitMapper
手动生成
TinyMapper
EmitMapper
手动生成
TinyMapper
EmitMapper
手动生成
TinyMapper
EmitMapper
手动生成
TinyMapper
EmitMapper
手动生成
TinyMapper
EmitMapper
手动生成
TinyMapper
EmitMapper
手动生成
TinyMapper
EmitMapper
手动生成
TinyMapper
EmitMapper
手动生成
TinyMapper
EmitMapper
手动生成
TinyMapper
EmitMapper

个人使用总结:

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

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

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

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

EmitMapper 和TinyMapper 两者简单对比的更多相关文章

  1. MongoDB中insert方法、update方法、save方法简单对比

    MongoDB中insert方法.update方法.save方法简单对比 1.update方法 该方法用于更新数据,是对文档中的数据进行更新,改变则更新,没改变则不变. 2.insert方法 该方法用 ...

  2. .NET轻量级MVC框架:Nancy入门教程(二)——Nancy和MVC的简单对比

    在上一篇的.NET轻量级MVC框架:Nancy入门教程(一)——初识Nancy中,简单介绍了Nancy,并写了一个Hello,world.看到大家的评论,都在问Nancy的优势在哪里?和微软的MVC比 ...

  3. HTTPS, SPDY和 HTTP/2性能的简单对比

    中文原文:HTTPS, SPDY和 HTTP/2性能的简单对比 整理自:A Simple Performance Comparison of HTTPS, SPDY and HTTP/2 请尊重版权, ...

  4. 【转贴】Cortex系列M0-4简单对比

    转载网址:http://blog.sina.com.cn/s/blog_7dbd9c0e01018e4l.html 最近搞了块ST的Cortex-M4处理器,然后下了本文档.分享一下. 针对目前进入大 ...

  5. 简单对比Spark和Storm

    2013年参与开发了一个类似storm的自研系统, 2014年使用过spark 4个多月,对这两个系统都有一些了解. 下面是我关于这两个系统的简单对比: Spark: 1. 基于数据并行,https: ...

  6. Nancy和MVC的简单对比

    Nancy和MVC的简单对比 在上一篇的.NET轻量级MVC框架:Nancy入门教程(一)——初识Nancy中,简单介绍了Nancy,并写了一个Hello,world.看到大家的评论,都在问Nancy ...

  7. [评测]低配环境下,PostgresQL和Mysql读写性能简单对比(欢迎大家提出Mysql优化意见)

    [评测]低配环境下,PostgresQL和Mysql读写性能简单对比 原文链接:https://www.cnblogs.com/blog5277/p/10658426.html 原文作者:博客园--曲 ...

  8. 百度 OCR API 的使用以及与 Tesseract 的简单对比

    目录 百度 OCR API 初探 用 Python 调用百度 OCR API 与 Tesseract 的简单对比 百度 OCR API 初探 近日得知百度在其 APIStore 上开放了 OCR 的 ...

  9. Rx与Async Task的简单对比

    有关Reactive Extensions的介绍可见https://rx.codeplex.com/,总的来说,你可以当它是又一个异步编程的框架,它以观察者模式实现了对数据流的的“订阅”.一个列表,一 ...

随机推荐

  1. JS操作DOM对象——JS基础知识(四)

    一.JavaScript的三个重要组成部分 (1)ECMAScript(欧洲计算机制造商协会) 制定JS的规范 (2)DOM(文档对象模型)重点学习对象 处理网页内容的方法和接口 (3)BOM(浏览器 ...

  2. FTP详解

    概述 FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”.用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(Applicat ...

  3. 说说JSON和JSONP,浅析JSONP解决AJAX跨域问题

    说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?这两个问题目前都有不同的解决方案,比如数据可以用自定义字符串或者用XML来描述,跨域可以通过服 ...

  4. 日志文件 统计 网站PV IP

    1. 安装rrdtool yum install rrdtool 2. 创建 rrdtool 数据库 rrdtool create /opt/local/rrdtool/jicki.rrd -s 30 ...

  5. NSString的几个方法(rangeOfString,hasPrefix,hasSuffix,改变大小写...)

    - (NSRange)rangeOfString:(NSString *)searchString;//查找字符串中是包涵在某个字符串,并返回其开始位置和长度 例: NSRange range = [ ...

  6. HTML 基础语言

      打开DREAMWEAVER,新建HTML.. body的属性: bgcolor                页面背景色 background            背景壁纸.图片 text    ...

  7. UIP源码之ARP过程分析

    之前我们使用UIP实现了tcp和udp通讯今天来说说UIP的实现流程,当然,这篇文章里面只会涉及tcp和udp,暂时还没办法说DHCP,因为UIP的DHCP实现使用了协程的概念,下一章将协程之后再说D ...

  8. 苹果App Store开发者帐户从申请,验证,到发布应用(4)

    苹果App Store应用内支付(In-App Purchase) IAP简介 IAP的全称是In-App Purchase,应用内付费.这种业务模式允许用户免费下载试用,对应用内提供的商品选择消费, ...

  9. 【转】mysql中文乱码的一点理解

    我们自己鼓捣mysql时,总免不了会遇到这个问题:插入中文字符出现乱码,虽然这是运维先给配好的环境,但是在自己机子上玩的时候咧,总得知道个一二吧,不然以后如何优雅的吹牛B. 如果你也遇到了这个问题,咱 ...

  10. Splay初步【bzoj1503】

    做了一道水题,把bzoj1503用Splay重新写了一下. #include <bits/stdc++.h> #define rep(i, a, b) for (int i = a; i ...