这个ToArray()实现如何更优化?

时间:2012-09-12 01:59:30

标签: c# .net arrays optimization

我只是看看我们的代码库的历史记录,并找到了一个从此更改的签到:

    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()更快,但“创建多个数据结构”在哪里?

P / S:写这篇文章的人现在正在度假

3 个答案:

答案 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倍