您的位置:首页 > 其它

性能优化-列表类型转换(ConvertList<TSource, TResult>)

2013-12-16 16:55 671 查看
  之前,在项目中看到过一段通用列表类型转换的代码,直接的实现便是用反射。大概看了下,它用在领域模型转DTO和SOA接口中契约实体的转换等等。首先,它使用了反射,其次,还是在循环中使用,便有了优化的想法。

方法原型如: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次的结果如下:



  好了,就写到这里吧,如有不正之处还请指正,相互交流,共同进步~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐