List< T>Vs数组性能

本文关键字:数组 性能 Vs List | 更新日期: 2023-09-27 18:17:42

我试着设置List value

List< int > a;
//...
a[i] = X;

ilspy显示设置编译为:

callvirt instance void class [mscorlib]System.Collections.Generic.List`1<int32>::set_Item(int32, !0)

但是这个代码

int[] b;
//...
b[i] = Y;

编制

stelem.i4

并且在我的基准测试中速度更快了7次。

据我所知,虚拟呼叫比虚拟电话更昂贵。是否可以使用List与数组性能

代码:

   static void Main(string[] args)
    {
        int N = int.Parse(args[0]);
        int M = int.Parse(args[1]);
        var sw = new Stopwatch();
        sw.Start();
        int[] a = new int[N];
        for (int k = 0; k < M; ++k)
        {
            for (int i = 0; i < N; ++i)
            {
                a[i] = i * 2;
                a[i] -= i;
                a[i] += 1;
            }
        }
        sw.Stop();
        Console.WriteLine(sw.ElapsedMilliseconds + ":" + a[N - 1]);
        var b = new List<int>(N);
        for (int i = 0; i < N; ++i)
        {
            b.Add(0);
        }
        sw.Restart();
        for (int k = 0; k < M; ++k)
        {
            for (int i = 0; i < N; ++i)
            {
                b[i] = i * 2;
                b[i] -= i;
                b[i] += 1;
            }
        }
        sw.Stop();
        Console.WriteLine(sw.ElapsedMilliseconds + ":" + b[N - 1]);
    }

运行并输出:

> ./Console.exe 1000000 100
166:1000000
1467:1000000

List< T>Vs数组性能

No.

List<T>包装了一个数组,它有一些必要的开销(首先因为它是一个类)。此外,插入和删除之类的操作开销很大,特别是当它导致对列表中所有其他元素重新排序时。

如果你不想要List<T>的开销,或者需要它的动态大小、插入和删除等特性,可以使用数组。如果您想要或需要使用List<T>,请接受性能损失。

你将很难写出比。net BCL团队更高效的代码,特别是当涉及到重新调整数组大小和其他可以从直接访问底层内存/操作系统函数中受益的操作时。