c# 映射對比測試(測試對象,測試案例,測試結果)
測試組件對象:
TinyMapper-EmitMapper-AutoMapper-NLiteMapper-Handwritten
對比測試案例:
類:Models
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace ConsoleApplication1
8 {
9 public class Models
10 {
11 public class Person
12 {
13 public Guid Id { get; set; }
14 public String Name { get; set; }
15 public Int32 Age { get; set; }
16 public Address Address { get; set; }
17 public string Number { get; set; }
18 }
19 public class PersonDto
20 {
21 public Guid Id { get; set; }
22 public String UserName { get; set; }
23 public Int32 Age { get; set; }
24 public Address Address { get; set; }
25 public string Number { get; set; }
26 }
27
28 public sealed class Address
29 {
30 public string Phone { get; set; }
31 public string Street { get; set; }
32 public string ZipCode { get; set; }
33 }
34 }
35 }
類:CodeTimer
1 using System;
2 using System.Collections.Generic;
3 using System.Diagnostics;
4 using System.Linq;
5 using System.Runtime.InteropServices;
6 using System.Text;
7 using System.Threading;
8 using System.Threading.Tasks;
9
10 namespace ConsoleApplication1
11 {
12 public sealed class CodeTimer
13 {
14 public static void Initialize()
15 {
16 Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;
17 Thread.CurrentThread.Priority = ThreadPriority.Highest;
18 Time("", 1, () => { });
19 }
20
21 public static void Time(string name, Action action)
22 {
23 Time(name, 1, action);
24 }
25
26 public static void Time(string name, int iteration, Action action)
27 {
28 if (String.IsNullOrEmpty(name)) return;
29
30 // 1.
31 ConsoleColor currentForeColor = Console.ForegroundColor;
32 Console.ForegroundColor = ConsoleColor.Red;
33 Console.WriteLine(name);
34
35 // 2.
36 GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
37 int[] gcCounts = new int[GC.MaxGeneration + 1];
38 for (int i = 0; i <= GC.MaxGeneration; i++)
39 {
40 gcCounts[i] = GC.CollectionCount(i);
41 }
42
43 // 3.
44 Stopwatch watch = new Stopwatch();
45 watch.Start();
46 long cycleCount = GetCycleCount();
47 for (int i = 0; i < iteration; i++) action();
48 long cpuCycles = GetCycleCount() - cycleCount;
49 watch.Stop();
50
51 // 4.
52 Console.ForegroundColor = currentForeColor;
53 Console.WriteLine("\tTime Elapsed:\t" + watch.ElapsedMilliseconds.ToString("N0") + "ms");
54 Console.WriteLine("\tCPU Cycles:\t" + cpuCycles.ToString("N0"));
55
56 // 5.
57 for (int i = 0; i <= GC.MaxGeneration; i++)
58 {
59 int count = GC.CollectionCount(i) - gcCounts[i];
60 Console.WriteLine("\tGen " + i + ": \t\t" + count);
61 }
62
63 Console.WriteLine();
64
65 }
66
67 private static long GetCycleCount()
68 {
69 return GetCurrentThreadTimes();
70 }
71
72 [DllImport("kernel32.dll", SetLastError = true)]
73 static extern bool GetThreadTimes(IntPtr hThread, out long lpCreationTime,
74 out long lpExitTime, out long lpKernelTime, out long lpUserTime);
75
76 private static long GetCurrentThreadTimes()
77 {
78 long l;
79 long kernelTime, userTimer;
80 GetThreadTimes(GetCurrentThread(), out l, out l, out kernelTime,
81 out userTimer);
82 return kernelTime + userTimer;
83 }
84
85 [DllImport("kernel32.dll")]
86 static extern IntPtr GetCurrentThread();
87 }
88 }
類:Program
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6 using Nelibur.ObjectMapper;//安裝TinyMapper
7 using Nelibur.ObjectMapper.Bindings;
8 using EmitMapper;//安裝EmitMapper
9 using AutoMapper;//安裝AutoMapper
10 using NLite;
11 using EmitMapper.MappingConfiguration;
12 using System.Reflection;//安裝NLite
13
14 namespace ConsoleApplication1
15 {
16 public class Program : Models
17 {
18 protected static List<Person> _person;
19 protected static List<PersonDto> _personDto;
20
21 static void Main(string[] args)
22 {
23 Base();
24 //進行測試 測試次數1次
25 CodeTimer.Time("--TinyMapper--測試", 1, () => Test1());
26 CodeTimer.Time("--EmitMapper--測試", 1, () => Test2());
27 CodeTimer.Time("--AutoMapper--測試", 1, () => Test3());
28 CodeTimer.Time("--NLiteMapper--測試", 1, () => Test4());
29 CodeTimer.Time("--Handwritten--測試", 1, () => Test5());
30 ConsoleColor currentForeColor = Console.ForegroundColor;
31 Console.ForegroundColor = ConsoleColor.Yellow;
32 Console.WriteLine("任務完成");
33 Console.ReadKey();
34 }
35
36 #region 初始化數據
37 public static void Base()
38 {
39 _person = new List<Person>();
40
41 for (int i = 0; i < 1000000; i++)
42 {
43 Person _per = new Person()
44 {
45 Id = Guid.NewGuid(),
46 Name = "老黑",
47 Age = 22,
48 Address = new Address
49 {
50 Phone = "18772871387",
51 Street = "小紅門",
52 ZipCode = "郵編未知",
53 },
54 Number = "123456789"
55 };
56 _person.Add(_per);
57 }
58 }
59 #endregion
60
61 #region TinyMapper映射
62 static void Test1()
63 {
64 //TinyMapper.Bind<Person,PersonDto>();
65 //_personDto = TinyMapper.Map<List<PersonDto>>(_person);
66 TinyMapper.Bind<Person, PersonDto>(config =>
67 {
68 config.Bind(x => x.Id, y => y.Id);
69 config.Bind(x => x.Name, y => y.UserName);
70 config.Bind(x => x.Age, y => y.Age);
71 config.Bind(x => x.Address.Phone, y => y.Address.Phone);
72 config.Bind(x => x.Address.Street, y => y.Address.Street);
73 config.Bind(x => x.Address.ZipCode, y => y.Address.ZipCode);
74 config.Bind(x => x.Number, y => y.Number);
75 });
76 _personDto = TinyMapper.Map<List<PersonDto>>(_person);
77 }
78 #endregion
79
80 #region EmitMapper 映射
81 static void Test2()
82 {
83 _personDto.Clear();
84 //EmitMapper.ObjectsMapper<List<Person>, List<PersonDto>> mapper = ObjectMapperManager.DefaultInstance.GetMapper<List<Person>, List<PersonDto>>();
85 //_personDto = mapper.Map(_person);
86 EmitMapper.ObjectsMapper<List<Person>, List<PersonDto>> mapper;
87 mapper = ObjectMapperManager.DefaultInstance.GetMapper<List<Person>, List<PersonDto>>(new DefaultMapConfig()
88 .ConvertUsing<Person, PersonDto>(value => new PersonDto
89 {
90 Id = value.Id,
91 UserName = value.Name,
92 Age = value.Age,
93 Address = new Address()
94 {
95 Phone = value.Address.Phone,
96 Street = value.Address.Street,
97 ZipCode = value.Address.ZipCode,
98 },
99 Number = value.Number
100 })
101 );
102 _personDto = mapper.Map(_person);
103 }
104 #endregion
105
106 #region AutoMapper 映射
107 static void Test3()
108 {
109 _personDto.Clear();
110 //AutoMapper.Mapper.CreateMap<Person,PersonDto>();
111 //_personDto = AutoMapper.Mapper.Map<List<PersonDto>>(_person);
112
113
114 AutoMapper.Mapper.CreateMap<Person, PersonDto>()
115 .ConstructUsing(value => new PersonDto
116 {
117 Id = value.Id,
118 UserName = value.Name,
119 Age = value.Age,
120 Address = new Address()
121 {
122 Phone = value.Address.Phone,
123 Street = value.Address.Street,
124 ZipCode = value.Address.ZipCode,
125 },
126 Number = value.Number
127 });
128 _personDto = AutoMapper.Mapper.Map<List<PersonDto>>(_person);
129 }
130 #endregion
131
132 #region NLiteMapper 映射
133 static void Test4()
134 {
135 _personDto.Clear();
136 //NLite.Mapping.IMapper<List<Person>, List<PersonDto>> mapper = NLite.Mapper.CreateMapper<List<Person>, List<PersonDto>>();
137 //_personDto = mapper.Map(_person);
138 NLite.Mapping.IMapper<List<Person>, List<PersonDto>> mapper;
139 mapper = NLite.Mapper.CreateMapper<List<Person>, List<PersonDto>>()
140 .ConvertUsing<Person, PersonDto>(v => new PersonDto
141 {
142 Id = v.Id,
143 UserName = v.Name,
144 Age = v.Age,
145 Address = new Address()
146 {
147 Phone = v.Address.Phone,
148 Street = v.Address.Street,
149 ZipCode = v.Address.ZipCode,
150 },
151 Number = v.Number
152 });
153 _personDto = mapper.Map(_person);
154 }
155 #endregion
158 #region Handwritten 手工映射
159 static void Test5()
160 {
161 _personDto.Clear();
162 _personDto = new List<PersonDto>();
163 PersonDto p = new PersonDto();
164 for (int i = 0; i < _person.Count; i++)
165 {
166 p.Id = _person[i].Id;
167 p.UserName = _person[i].Name;
168 p.Age = _person[i].Age;
169 p.Address = _person[i].Address;
170 p.Number = _person[i].Number;
171 _personDto.Add(p);
172 }
173 }
174 #endregion
對比測試結果截圖:
