List <T>与数组性能

用户名

我尝试设置List <int>值

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倍。

据我了解,虚拟通话比Stelem更昂贵。List <T>是否可以与数组性能一起使用

更新

码:

   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>包装一个数组,它有一些必要的开销(首先是因为它是一个类)。同样,插入和删除之类的操作也很昂贵,特别是当它导致对列表中的所有其他元素重新排序时。

如果您不希望增加List<T>动态大小,也不想使用诸如动​​态大小之类的功能,请使用数组。如果要使用List<T>,请接受性能损失。

与.NET BCL团队相比,您将很难编写更有效的代码,尤其是在调整数组大小和其他可直接访问底层内存/ OS函数的操作中受益的操作时。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

提高List <T>的性能

来自分类Dev

List <T>到Javascript数组

来自分类Dev

添加数组vs列表的List.AddRange性能

来自分类Dev

List <struct>与List <class>的性能

来自分类Dev

List <struct>与List <class>的性能

来自分类Dev

使用List <Func <T,object >>时,索引超出数组的范围

来自分类Dev

List <T> .AddRange / InsertRange创建临时数组

来自分类Dev

将list <T>或数组作为IEnumerable类型的参数传递

来自分类Dev

使用List <Func <T,object >>时,索引超出数组的范围

来自分类Dev

用数组初始化List <T>并填充

来自分类Dev

C# List<T>.Sort - 为什么默认实现有这么好的性能?

来自分类Dev

List <T>与IEnumerable <T>

来自分类Dev

List <T>与IEnumerable <T>

来自分类Dev

如何使用泛型方法将List <T>转换为数组t [](对于基本类型)?

来自分类Dev

如何使用泛型方法将List <T>转换为数组t [](对于基本类型)?

来自分类Dev

如何使用c#将list <T>转换为数组T []

来自分类Dev

List.toArray(Object [])性能

来自分类Dev

合并List <T>和List <Optional <T >>

来自分类Dev

多维数组与字典性能

来自分类Dev

bindValue / bindParam与数组性能

来自分类Dev

由于IEnumerable <T>不起作用,如何解析List或2D数组?

来自分类Dev

在C#中序列化List <T>并将其反序列化为js数组

来自分类Dev

什么时候会比List <T>更喜欢数组,LinkedList或ArrayList?

来自分类Dev

Jackson:将字符串数组反序列化为List <T>

来自分类Dev

由于IEnumerable <T>不起作用,如何解析List或2D数组?

来自分类Dev

List <T>构造函数(IEnumerable <T>)不接受从Array.CreateInstance(Type,Int32)创建的数组

来自分类Dev

获取List <T>的类

来自分类Dev

wcf从list <T>继承

来自分类Dev

List <T>项目顺序

Related 相关文章

热门标签

归档