c# - 将克隆添加到列表中很慢
问题描述
我正在尝试加快一个循环,即克隆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();
你能帮我找出为什么那些Add
s要花这么多时间吗?
解决方案
不幸的是,循环很多东西和深度复制对象需要时间。我认为 3 秒不一定是不合理的时间。
但是您可以潜在地提高速度。
首先,如果您事先知道结果列表需要保存多少个项目,您可以预先设置内部容量,以防止列表不得不调整大小。调整大小是一项昂贵的活动,必要时可以避免。这可以通过手动更改列表的容量属性或通过将容量作为构造函数参数传递给列表来完成。
一旦分配了容量,添加到列表的复杂性应该是O(1)
,不需要重新分配(这是一项O(n)
复杂性任务,请参阅此答案)。在这种情况下,添加到列表中不太可能成为瓶颈。
您还可以从预先复制的初始列表中删除空值,以消除对每次都必须评估的 if 语句的需要。使用linq:
var noNulls = listSource.where(o => o != null)
推荐阅读
- javascript - 对象上的 vue 推送属性
- python - 如何将字典作为输入\参数发送到 AWS 步骤函数
- node.js - Google Secret Manager 客户端的玩笑被破坏了
- google-bigquery - 未找到用户定义的函数
- python - 在 python (2.7) 中使用'with open'时,如果出现错误,我是否需要一个'finally close'块(参见示例)
- android - 屏幕关闭时,Android WifiManager.startScan() 返回 false
- jquery - 在日期范围内,开始日期应比当前日期早一个月
- python - Python:遍历字符串字典以声明变量名
- c - 无法限制 FPS OpenGL 和 C
- python - Python - 遍历两个对象列表并获取父实例名称