List <T> vs array perfomance

use*_*837 4 .net c# performance bytecode generic-list

我尝试设置List <int>值

List< int > a;
//...
a[i] = X;
Run Code Online (Sandbox Code Playgroud)

ilspy显示设置编译为:

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

但是这段代码

int[] b;
//...
b[i] = Y;
Run Code Online (Sandbox Code Playgroud)

编译成

stelem.i4
Run Code Online (Sandbox Code Playgroud)

用我的基准测试,它的速度提高了7倍.

据我所知,虚拟通话比stelem更贵.是否可以使用List <T>与数组perfomace

更新

码:

   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]);
    }
Run Code Online (Sandbox Code Playgroud)

运行和输出:

> ./Console.exe 1000000 100

166:1000000
1467:1000000
Run Code Online (Sandbox Code Playgroud)

Pat*_*man 8

没有.

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

如果您不想要开销List<T>或需要动态大小,插入和删除等功能,请使用数组.如果您想要或需要使用List<T>,请接受性能损失.

您将很难编写比.NET BCL团队更高效的代码,特别是在重新调整阵列和其他可以直接访问底层内存/操作系统功能的操作时.