Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列表<;T>;vs阵列性能_C#_.net_Performance_Bytecode_Generic List - Fatal编程技术网

C# 列表<;T>;vs阵列性能

C# 列表<;T>;vs阵列性能,c#,.net,performance,bytecode,generic-list,C#,.net,Performance,Bytecode,Generic List,我尝试设置List值 List< int > a; //... a[i] = X; 编译成 stelem.i4 在我的基准测试中,速度提高了7倍 据我所知,虚拟电话比stelem更贵。是否可以将列表与数组性能一起使用 更新 代码: 没有 List包装一个数组,它有一些必要的开销(首先是因为它是一个类)。此外,插入和删除等操作的成本也很高,特别是当它导致对列表中的所有其他元素重新排序时 如果您不想增加列表的开销或需要动态大小、插入和删除等功能,请使用数组。如果您想要或需要使用列表,

我尝试设置List

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

stelem.i4
在我的基准测试中,速度提高了7倍

据我所知,虚拟电话比stelem更贵。是否可以将列表与数组性能一起使用

更新

代码:

没有

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

如果您不想增加
列表的开销
或需要动态大小、插入和删除等功能,请使用数组。如果您想要或需要使用
列表
,请接受性能损失


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

成本高昂的插入/删除也可以。但不可能优化之前存在的元素设置吗?Ie设置列表元素而不进行昂贵的虚拟调用这听起来好像列表总是效率较低,但事实并非如此。如果需要不断调整列表的大小,则列表的性能会更好。OP正在进行微观优化。“如果你不想要列表的开销,请使用数组”不,在适当的时候使用它,因此如果你想添加或删除项目,请使用列表,如果你想要固定大小的集合,请使用数组。我认为你的度量可能不正确(我觉得系数7很重要)。使用
List
@user1312837,您将无法获得比.NET团队更好的性能。我不明白您正在编写哪种代码?如果性能如此关键,我认为你根本不应该使用.Net。@TimSchmelter:你可能是对的。我改变了答案来强调这一点。你需要收藏的大小是动态的吗?如果是,请使用
列表
,否则使用
数组
int[] b;
//...
b[i] = Y;
stelem.i4
   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