【发布时间】:2019-03-02 03:03:49
【问题描述】:
我正在尝试加快循环,即克隆 2_500_000 个对象。 克隆本身在整个循环中需要 800 毫秒,但是当我将它们添加到列表中时,它需要 3 秒..
List<T> list = new List<T>();
Stopwatch sw = new Stopwatch();
sw.Start();
foreach(T entity in listSource)
{
T entityCloned = GetEntityClone(entity); // Taking 800ms totally
if (entityCloned != null)
list.Add(entityCloned);
}
sw.Stop();
你能帮我找出为什么那些Adds 花了这么多时间吗?
【问题讨论】:
-
试试
list.AddRange(listSource.Select(s => GetEntityClone(s)).Where(s => s != null)); -
如果克隆成为
null的唯一方法是原始本身是null,那么您可能想改写listSource.Where(s => s != null).Select(s => GetEntityClone(s))(在克隆前过滤) -
List<T> list = new List<T>(2500000);为了防止内存重新分配 -
什么是 T?一个类,结构?类通过引用传递。将第 N 个引用插入 List 不会花费很长时间。但是必须复制结构。将结构插入列表需要复制
GetEntityClone()返回的结构。复制大型结构需要时间 -
简单的
new List<T>(listSource.Count)怎么样?如果静态数组可以降低 33% 的性能,那么给列表一个初始容量也可以达到同样的效果。
标签: c# list performance object clone