我只是看看我们的代码库的历史记录,并找到了一个从此更改的签到:
public virtual T[] ToArray()
{
List<T> list = new List<T>();
foreach (object item in List)
{
list.Add((T)item);
}
return list.ToArray();
}
到此:
public virtual T[] ToArray()
{
T[] result = new T[List.Count];
for (int i = 0; i < List.Count; ++i)
{
result[i] = (T)List[i];
}
return result;
}
评论:优化ToArray实现,以避免在流程中创建多个数据结构。
我想知道为什么这里有优化。 for()
可能比foreach()
更快,但“创建多个数据结构”在哪里?
答案 0 :(得分:9)
在原始代码中,您创建了List<T>
- 未指定容量,因此可能涉及多次复制内部数组 - 然后您在ToArray
上调用List<T>
,得到一份副本。
较新版本不会这样做。它创建一个数组,并将原始列表复制到其中。
不可否认,只使用LINQ的ToArray
方法会更简单,甚至可能更有效,而且不清楚为什么这是一个虚拟方法,但是......
答案 1 :(得分:3)
第一个实现创建一个中间人额外的List对象;它只是GC清理的另一件事。这种优化几乎肯定不会引人注意,除非这个例程达到了极高的水平。
否则,它与使用foreach
还是for
无关。这种选择很大程度上取决于列表在枚举时无法修改的规则。
答案 2 :(得分:0)
为了获得更快的将列表转换为数组的性能,HPCsharp nuget包实现了List.ToArray()的并行(多核)版本:
public virtual T[] ToArray()
{
return List.ToArrayPar();
}
该方法不是必需的,但只要需要Array,就可以使用List.ToArrayPar()函数。这个并行版本比List.ToArray()快大约3倍