【问题标题】:Which one is faster List<T> or ArrayList<T>? [duplicate]List<T> 或 ArrayList<T> 哪个更快? [复制]
【发布时间】:2011-03-09 19:50:04
【问题描述】:

可能重复:
.NET: ArrayList vs List

你好,

我在网上搜索并找到了相互矛盾的答案,目前还不清楚, 哪个更快List&lt;T&gt; or ArrayList&lt;T&gt;,是什么原因?

我猜List&lt;T&gt; 应该更快但不确定,因为在这种特定情况下,即使ArrayList&lt;T&gt; 也被标记为泛型类型。

非常感谢, 玛尼

【问题讨论】:

标签: c# .net generics


【解决方案1】:

我猜你的意思是List&lt;T&gt;ArrayList

您应该使用List&lt;T&gt; 而不是ArrayList,因为它没有所有的装箱\取消装箱功能。

【讨论】:

    【解决方案2】:

    这是我为你做的。

       static void Main(string[] args)
        {
            Stopwatch sw = new Stopwatch();
            Console.WriteLine("Adding a million 32bit integers");
    
            sw.Start();
            List<int> listA = new List<int>();
            for(int i = 0; i < 1000000; i++)
            {
                listA.Add(i);
            }
            sw.Stop();
            Console.WriteLine("List<int> took {0} ms", sw.ElapsedMilliseconds);
            sw.Reset();
    
            sw.Start();
            List<object> listB = new List<object>();
            for (int i = 0; i < 1000000; i++)
            {
                listB.Add(i);
            }
            sw.Stop();
            Console.WriteLine("List<object> took {0} ms", sw.ElapsedMilliseconds);
            sw.Reset();
    
            sw.Start();
            ArrayList listC = new ArrayList();
            for(int i = 0; i < 1000000; i++)
            {
                listC.Add(i);
            }
            sw.Stop();
            Console.WriteLine("ArrayList took {0} ms", sw.ElapsedMilliseconds);
            sw.Reset();
    
            Console.WriteLine("\n Inserting 1000 values");
            //Gen list of random numbers
            Random rand = new Random(12345);
            int[] insertlocs = new int[1000];
            for (int i = 0; i < insertlocs.Length; i++)
                insertlocs[i] = rand.Next(1, 999999);
    
            sw.Start();
            for (int i = 0; i < insertlocs.Length; i++)
            {
                listA.Insert(insertlocs[i], i);
            }
            sw.Stop();
            Console.WriteLine("List<int> took {0} ms", sw.ElapsedMilliseconds);
            sw.Reset();
    
            sw.Start();
            for (int i = 0; i < insertlocs.Length; i++)
            {
                listB.Insert(insertlocs[i], i);
            }
            sw.Stop();
            Console.WriteLine("List<object> took {0} ms", sw.ElapsedMilliseconds);
            sw.Reset();
    
            sw.Start();
            for (int i = 0; i < insertlocs.Length; i++)
            {
                listC.Insert(insertlocs[i], i);
            }
            sw.Stop();
            Console.WriteLine("ArrayList took {0} ms", sw.ElapsedMilliseconds);
            sw.Reset();
    
            Console.ReadKey();
        }
    

    在我的比赛中,List&lt;int&gt; 用了 13 毫秒,List&lt;object&gt; 用了 69 毫秒,ArrayList 用了 40 毫秒。

    所以你有它,对于引用类型 ArrayList 更快。但是对于值类型,您显然应该使用 List

    编辑:也测试插入性能,List&lt;int&gt; 用了 255 毫秒,List&lt;object&gt; 用了 723 毫秒,ArrayList 用了 397 毫秒。 ArrayList with boxing 和 List without boxing 差不多!

    【讨论】:

    • 尝试将new Object() 添加到ListB 以避免装箱(注意有一个错字:在第二次测试中,您在循环中使用了ListA)。
    • 我在发布结果之前修复了错字,但在复制代码之后,它仍然有效,但感谢您指出。你是什​​么意思?值在 List 和 ArrayList 中都装箱,将整数转换为对象根本不会改变性能。
    • 一件有趣的事情是,如果你在创建时设置集合的大小,List 会变得更快,而 ArrayList 会变得更慢,至少在我的机器上是这样。
    • 哇,也很重要!我要看看这些课程,看看他们有什么不同。
    • @Hannesh:确实,值类型在添加到List&lt;Object&gt;ArrayList 时都会被装箱,但是你在比较什么?除非是同质的,否则不会使用List&lt;Object&gt;。泛型类型的两个好处是避免装箱和类型安全。
    【解决方案3】:

    我猜这取决于,您是在谈论查找、插入等吗?

    【讨论】:

    • +1 他们各有优缺点
    猜你喜欢
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    相关资源
    最近更新 更多