首页 > 解决方案 > 将克隆添加到列表中很慢

问题描述

我正在尝试加快一个循环,即克隆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要花这么多时间吗?

标签: c#listperformanceobjectclone

解决方案


不幸的是,循环很多东西和深度复制对象需要时间。我认为 3 秒不一定是不合理的时间。

但是您可以潜在地提高速度。

首先,如果您事先知道结果列表需要保存多少个项目,您可以预先设置内部容量,以防止列表不得不调整大小。调整大小是一项昂贵的活动,必要时可以避免。这可以通过手动更改列表的容量属性或通过将容量作为构造函数参数传递给列表来完成

一旦分配了容量,添加到列表的复杂性应该是O(1),不需要重新分配(这是一项O(n)复杂性任务,请参阅此答案)。在这种情况下,添加到列表中不太可能成为瓶颈。

您还可以从预先复制的初始列表中删除空值,以消除对每次都必须评估的 if 语句的需要。使用linq

var noNulls = listSource.where(o => o != null)


推荐阅读