性能优化-列表类型转换(ConvertList<TSource, TResult>)
2013-12-16 16:55
671 查看
之前,在项目中看到过一段通用列表类型转换的代码,直接的实现便是用反射。大概看了下,它用在领域模型转DTO和SOA接口中契约实体的转换等等。首先,它使用了反射,其次,还是在循环中使用,便有了优化的想法。
方法原型如:public static List<TResult> ConvertList<TSource, TResult>(List<TSource> source) where TResult : new(),下面贴出代码。说明一下,在此我没有任何的贬义,这段代码可能比较老,其次在项目中,首先是实现功能,如果当时没有更好的实现,就先实现功能,后面有时间可以在优化,毕竟项目有时间节点,个人自己平衡哈。
View Code
在Release模式下编译后,对于10W个元素的列表执行10次结果如下:
如果执行次数增加,还会有更大的差距,因为已经为类型缓存了委托,就几乎相当于直接方法调用了,而老的实现每次都需要反射SetValue。但是动态编译生成委托,这个过程比较耗时,可以作为初始化,只执行一次,后面就一劳永逸了。
执行100次的结果如下:
好了,就写到这里吧,如有不正之处还请指正,相互交流,共同进步~~
方法原型如:public static List<TResult> ConvertList<TSource, TResult>(List<TSource> source) where TResult : new(),下面贴出代码。说明一下,在此我没有任何的贬义,这段代码可能比较老,其次在项目中,首先是实现功能,如果当时没有更好的实现,就先实现功能,后面有时间可以在优化,毕竟项目有时间节点,个人自己平衡哈。
class SourceEntity { public int UserId { get; set; } public string name { get; set; } public string p3 { get; set; } public string p4 { get; set; } public string p5 { get; set; } public string p6 { get; set; } public string p7 { get; set; } public string p8 { get; set; } public string p9 { get; set; } public string p10 { get; set; } public string p11 { get; set; } public string sourceOther { get; set; } } class ResultEntity { public int UserId { get; set; } public string Name { get; set; } public string P3 { get; set; } public string P4 { get; set; } public string P5 { get; set; } public string P6 { get; set; } public string P7 { get; set; } public string P8 { get; set; } public string P9 { get; set; } public string P10 { get; set; } public string P11 { get; set; } public string Comment { get; set; } } static List<SourceEntity> GenerateSources(int length) { List<SourceEntity> result = new List<SourceEntity>(); for (int i = 0; i < length; i++) { result.Add(new SourceEntity { UserId=i, name="stevey"+i, p3=i.ToString(), p4 = i.ToString(), p5 = i.ToString(), p6 = i.ToString(), p7 = i.ToString(), p8 = i.ToString(), p9 = i.ToString(), p10 = i.ToString(), p11 = i.ToString(), sourceOther="sourceOther" }); } return result; } public static void Main(string[] args) { List<SourceEntity> sourceList = GenerateSources(100000);//生成测试数据 CodeTimer.Initialize(); //对于10W个元素集合执行10次转换,如下 CodeTimer.Time("常规反射实现的类型转换", 10, () => { var resultList = ObjectConvertHelperOld.ConvertList<SourceEntity, ResultEntity>(sourceList); }); CodeTimer.Time("优化过的类型转换",10, () => { var resultList = ObjectConvertHelper.ConvertList<SourceEntity, ResultEntity>(sourceList); }); Console.ReadKey(); }
View Code
在Release模式下编译后,对于10W个元素的列表执行10次结果如下:
如果执行次数增加,还会有更大的差距,因为已经为类型缓存了委托,就几乎相当于直接方法调用了,而老的实现每次都需要反射SetValue。但是动态编译生成委托,这个过程比较耗时,可以作为初始化,只执行一次,后面就一劳永逸了。
执行100次的结果如下:
好了,就写到这里吧,如有不正之处还请指正,相互交流,共同进步~~
相关文章推荐
- 列表类型转换(ConvertList<TSource, TResult>)
- NHibernate初探(二) 对于IList<object[]>到持久类类型的转换
- jquery 中$.post获取MVC Controller中JsonResult返回包含LIst<Model>类型的子List<Model>的高级使用方法
- List<PointF> pointsA转换为pointsF[]类型的数组
- list<string>转换成list<int>类型
- List<T>泛型集合 类型整体快速转换
- Hql的select 语句返回Ilist<object[]>类型,如何转换为映射类型
- 将泛型集合类(List<T>)转换成DataTable,返回的DataTable所有列的数据类型为string型,且列顺序与字符串提供的字段顺序一致
- 类型转换——如何将一个List<Map<String,String>>类型换成json格式
- List<?>不能直接被类型转换
- Arraylist LinkedList 区别 (读 <Java性能优化> 之List接口笔记 )
- 关于IList类型与IList<T>在运行时类型转换失败的问题
- 无法将类型“System.Collections.Generic.List<anonymous type:string ClassID,string ClsssName>”隐式转换为“System.Collections.Generic.List<Ecology.Model.EnergyFlowGraph>”
- android json转换成List<Map>优化
- ASP.NET.MVC--注解和反射将Enum转换List<SelectListItem>为@Html.DropDownListFor()下拉列表的通用方法
- 如何将一个List<Map<String,String>>类型的集合数据转换成json格式输出
- Java集合三种类型:Set<集>、List<列表>、Map<映射>
- C#读取数据库返回泛型集合 把DataSet类型转换为List<T>泛型集合
- 无法将类型“System.Collections.Generic.IEnumerable<EmailSystem.Model.TemplateInfo>”隐式转换为“System.Collections.Generic.List<EmailSystem.Model.TemplateInf
- List<Map>类型的JavaScript数组应用范例:资讯列表多样化显示