EmitMapper 和TinyMapper 兩者簡單對比(若轉載請註明)

来源:http://www.cnblogs.com/qinxingnet/archive/2017/01/25/6349984.html
-Advertisement-
Play Games

前言: 我們在很多項目場景中使用對象映射工具,那麼使用最多的OOM對象工具也就那幾個。今天所說的EmitMapper 和TinyMapper 兩者的性能都是很高的,相比autoMapper 速度不知道快了多少倍,因為我平時使用的最多EmitMapper,所在業餘時間做了一下測試兩者對比。 測試數據: ...


前言:

 我們在很多項目場景中使用對象映射工具,那麼使用最多的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數據對象(為了方便看就寫在一起了):

 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     /// 測試對象A
13     /// </summary>
14     public class TestModelA: TestModel
15     {
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 : TestModel
26     {
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 OrderItem
46     {
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 OrderItem2
63     {
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" + i
27                         ,
28                         isMem = i % 2 == 0
29                     }
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.isMem
21                }
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    534
10 EmitMapper    615
11 手動生成    463
12 TinyMapper    530
13 EmitMapper    617
14 手動生成    486
15 TinyMapper    550
16 EmitMapper    645
17 手動生成    465
18 TinyMapper    551
19 EmitMapper    654
20 手動生成    450
21 TinyMapper    541
22 EmitMapper    641
23 手動生成    442
24 TinyMapper    551
25 EmitMapper    674
26 手動生成    477
27 TinyMapper    543
28 EmitMapper    606
29 手動生成    458
30 TinyMapper    517
31 EmitMapper    584
32 手動生成    445
33 TinyMapper    512
34 EmitMapper    555
35 手動生成    456
36 TinyMapper    521
37 EmitMapper    580
38 手動生成    475
39 TinyMapper    550
40 EmitMapper    613
41 手動生成    523
42 TinyMapper    603
43 EmitMapper    673
44 手動生成    440
45 TinyMapper    500
46 EmitMapper    568
47 手動生成    457
48 TinyMapper    532
49 EmitMapper    607
50 手動生成    410
51 TinyMapper    472
52 EmitMapper    559
53 手動生成    477
54 TinyMapper    536
55 EmitMapper    596
56 手動生成    449
57 TinyMapper    521
58 EmitMapper    595
59 手動生成    488
60 TinyMapper    554
61 EmitMapper    640
62 手動生成    463
63 TinyMapper    520
64 EmitMapper    587
65 手動生成    432
66 TinyMapper    560
67 EmitMapper    605
View Code

 

 

 

個人使用總結:

tinyMapper 真的挺快的,EmitMapper 僅比其差了一點點而已(10萬-1000萬條數據中的映射場景並不多見,70多毫秒也不會太在意)。

因為EmitMapper的作者在2011年就不在維護了,我認為EmitMapper還是夠弔的了。

但tinyMapper 剛出來不久,但性能真的是無與倫對的美麗!!贊,希望能作者能改善。

最後給出我心中,以上工具的打分和優點缺點簡單評。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 微信公眾號作為一個平臺級別的產品,對商業應用來說,有很大的吸引力。如何讓公眾號更好的吸粉?靠內容不是一般小商戶可以做到的,那是網紅自媒體的強項。一般商戶要怎麼突圍?那就是提供實用,有意義的功能給粉絲。 而微信公眾號自身功能是非常匱乏的,沒有什麼提供,連客服功能都幾乎沒有,所以這些那些的,就需要開發人 ...
  • 我們十分重視您的隱私。本隱私聲明解釋了我們從您那裡收集的個人數據內容以及我們將如何使用這些數據。 我們不收集任何與個人信息相關的數據,只收集與本UWP運行相關的數據,如: 產品使用數據:如每個頁面的使用次數和相互關係等。 設備數據:您使用的Windows 10設備在本UWP上的唯一設備ID。 錯誤報 ...
  • 需求: 要用WCF生成 Restful風格的介面,返回 JOSN格式: 過程: 1.使用 WCF的 webHttp 綁定。 2.為了增加程式編碼的靈活性,使用了有弱類型特性的 Dictionary<string,object>來作為json字元串對應的類。 3.WCF 預設的序列化不支持 Dicti ...
  • 基本語法 (菜鳥系列學習教程) C#,又名Csharp,天朝喜歡叫C井。 C#是一種面向對象的編程語言。在面向對象的程式設計方法中,程式有各種相互交互的對象組成。相同種類的對象通常具有相同的類型,或者說,是在先溝通那個的class中。 例如,以Rectangle(矩形)對象為例,它具有length和 ...
  • 原文地址:https://mellinoe.wordpress.com/2017/01/18/net core game engine/ 作者:ERIC MELLINO 翻譯: "楊曉東(Savorboard)" 譯者序 通過翻譯這篇文章,我感受到了 .NET Core 真正的魅力,它真的是無所不能 ...
  • SQLite什麼都好,就怕“database is locked”這些年來想盡辦法去規避它。測試代碼: static void Test2() { XCode.Setting.Current.TransactionDebug = true; XTrace.WriteLine(Role.Meta.Co ...
  • 環境:Abp1.2 疑問:沒有調用工作單元的SaveChanges方法引起的事務提交時機的問題. 例如:有一個應用服務代碼如下: 根據用戶提交數據插入一條記錄,但在方法末未顯式調用SaveChanges方法 在Mvc的Controller里調用上述方法的代碼如下: 在_phraseAppServic ...
  • Forms認證即是表單認證,需提供身份id和密碼password的進行認證和授權管理。應該是大家比較熟悉的一種,剛接觸.net可能都會學學這個東西。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...