C#反射性能优化--上篇
2021/7/26 9:06:58
本文主要是介绍C#反射性能优化--上篇,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
前两天看到一篇说Automapper为什么比用反射快的文章,觉得挺有意思,反射的性能低老早就知道,但是一直没上手测过,对于反射性能优化也不知道。今天也没什么事情,想到这个让我好奇心按捺不住了,今天就写个测试一下。
目标
使用反射和Automapper组件分别实现 将对象转换成另一个对象
创建两个类
public class PersonSource { public string Name { get; set; } public int Age { get; set; } public string Address { get; set; } public string City { get; set; } public string Region { get; set; } public string PostalCode { get; set; } public string Country { get; set; } public string Phone { get; set; } public string FatherName { get; set; } public string MatherName { get; set; } public string Fax { get; set; } } public class Person { public string Name { get; set; } public int Age { get; set; } public string Address { get; set; } public string City { get; set; } public string Region { get; set; } public string PostalCode { get; set; } public string Country { get; set; } public string Phone { get; set; } public string FatherName { get; set; } public string MatherName { get; set; } public string Fax { get; set; } }
使用反射进行对象的转换的类
public class Auto { public static TDestination Mapper<TSource, TDestination>(TSource source) where TSource : class where TDestination : class { var typeSource = source.GetType(); var typeDestination = typeof(TDestination); var propsSource = typeSource.GetProperties(); var dest = Activator.CreateInstance(typeDestination); var propsDestination = dest.GetType().GetProperties(); foreach (var prop in propsSource) { var obj = prop.GetValue(source); var propDestination = propsDestination.FirstOrDefault(t => t.Name == prop.Name); if (propDestination != null) { propDestination.SetValue(dest, obj); } } return dest as TDestination; } }
使用BenchMark测试一下 一百万个对象的转换
代码如下:
[MemoryDiagnoser] public class BenchmarkDemo { public List<PersonSource> GetList() { List<PersonSource> list = new List<PersonSource>(); Enumerable.Range(0, 1_000_000).ToList().ForEach(x => { PersonSource personSource = new PersonSource { Name = "张三", Age = x, Address = "Beijing", City = "ShangHai", Region = "Huabei", PostalCode = "10000", Country = "China", Phone = "15200329999", FatherName = "老张", MatherName = "零零", Fax = "2200-7112-555" }; list.Add(personSource); }); return list; } [Benchmark] public void MyAutoTest() { var list = GetList(); list.ForEach(t => { Person destination = Auto.Mapper<PersonSource, Person>(t); }); } [Benchmark] public void AutoMapperTest() { var list = GetList(); var config = new MapperConfiguration(cfg => { cfg.CreateMap<PersonSource, Person>(); }); IMapper iMapper = config.CreateMapper(); list.ForEach(t => { Person destination = iMapper.Map<PersonSource, Person>(t); }); } }
static void Main(string[] args) { var summary = BenchmarkRunner.Run<BenchmarkDemo>(); }
运行代码结果如下:
上图可以看到,在转换一百万个对象时,使用反射比使用Automapper组件耗时更多 (一百万个对象转换大概耗时反射是Automapper的10倍,一千万个对象转换时 反射是Automapper的20倍),占用的内存也更多。
下一篇我们一起探究一下Automapper是如何做到如此高性能的,看看它是用什么方式优化反射的。
这篇关于C#反射性能优化--上篇的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#
- 2024-01-24Advanced .Net Debugging 1:你必须知道的调试工具
- 2024-01-24.NET集成IdGenerator生成分布式全局唯一ID