想必大家对[对象映射]并不陌生,本文为你带来AutoMapper和EmitMapper的性能分析,废话不多说,直接上测试代码。
【1】
Person person = new Person()
{
name = "Leo",
age = "200",
address = "asdhkjahsd",
basePerson = new BasePerson()
{
school = "xxx"
}
};
int count = 10000;
List<PersonA> list = new List<PersonA>();
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < count; i++)
{
PersonA personA = ObjectMapperManager.DefaultInstance.GetMapper<Person, PersonA>().Map(person);
list.Add(personA);
}
watch.Stop();
Console.WriteLine("EmitMapper---");
Console.WriteLine(watch.Elapsed);
List<PersonA> list1 = new List<PersonA>();
Stopwatch watch1 = new Stopwatch();
watch1.Start();
Mapper.CreateMap<Person, PersonA>();
for (int i = 0; i < count; i++)
{
PersonA personA = Mapper.Map<PersonA>(person); ;
list1.Add(personA);
}
watch1.Stop();
Console.WriteLine("AutoMapper---");
Console.WriteLine(watch1.Elapsed);
public class Person
{
public string name { get; set; }
public string age { get; set; }
public string address { get; set; }
public BasePerson basePerson { get; set; }
}
public class PersonA
{
public string name { get; set; }
public string age { get; set; }
public string address { get; set; }
public BasePerson basePerson { get; set; }
}
public class BasePerson
{
public string school { get; set; }
}
老司机可以直接略过这里,关于这里针对新手多说两句Stopwatch这个类,可能新手对这个类还不太熟悉,会问为什么不使用DateTime类型,使用开始时间和结束时间相减计算最终消耗的时间?
答:Stopwatch类型属于高精度时间戳,在对测试代码效率这方面精准度比DateTime会好,具体的StopWatch的使用可以自行查阅。
为了防止Heap扩容/GC带来的误差,一般测4次:
1.A
2.B
3.B
4.A
其实还有一种方法,预分配一个很大的对象,强制让Heap扩容 并且让GC阈值增大。
再通过一个互斥锁去控制多条线程并行的去执行你的代码。
前提条件是你的CPU有足够的核心数。
还有不能开超线程
每个人的测试结果有可能最终都不会相同 受个人电脑配置影响!
最终测试结果:
大家可以明显的看到EmitMapper的性能执行10000次反射大概是AutoMapper的3-4.5倍之间,尤为可惜的是EmitMapper的作者早在2010年已经停止更新,有兴趣的同学可以去CodePlex去下载源码看一下。
传送门 :http://emitmapper.codeplex.com/