数组与列表的性能比较

21 浏览
0 Comments

数组与列表的性能比较

假设您需要一个整数的列表/数组,需要频繁迭代,而且我指的是极其频繁。原因可能各不相同,但假设它在高容量处理的最内部循环的核心中。

一般来说,由于其大小的灵活性,人们会选择使用列表(List)。此外,msdn文档声称列表在内部使用数组,并且应该与数组一样快(经过Reflector的快速查看证实了这一点)。不过,这里确实涉及一些开销。

有人实际上测量过这个吗?迭代6M次列表是否需要与数组相同的时间?

admin 更改状态以发布 2023年5月23日
0
0 Comments

简答:

在 .NET 中,ListArray 的速度/性能相同,因为在 .NET 中,ListArray 的包装器。

再说一遍:在 .NET 中,List 是另一种语言中的 ArrayList 的内部扩展!


下面是关于在什么情况下使用哪种方法的细节:

  • 需要使用 Array:

    • 尽可能频繁使用。因为它速度快,在相同数量信息的情况下,占用 RAM 范围小。
    • 如果你知道需要的单元格数
    • 如果数据保存在数组中,小于 85000 b(对于整数数据来说,85000/32 = 2656 个元素)
    • 如果需要高的随机访问速度
  • 需要使用 List:

    • 如果需要经常向列表末尾添加单元格
    • 如果不经常向列表开头/中间添加单元格
    • 如果数据保存在数组中,小于 85000 b(对于整数数据来说,85000/32 = 2656 个元素)
    • 如果需要高的随机访问速度
  • 需要使用 LinkedList:

    • 如果经常需要向列表开头/中间/末尾添加单元格

    • 如果只需要顺序访问(前进/后退)

    • 如果需要保存大型项目,但项目计数较低。

    • 最好不要用于大量项目,因为它会使用额外的链接内存。

      如果你不确定是否需要 LinkedList,那么你不需要它。

只是不要使用它。


更多细节:

color meaning

Array vs List vs Linked List

更多的细节:

https://stackoverflow.com/a/29263914/4423545

0
0 Comments

测量非常容易...

在我知道长度固定的小型紧密循环处理代码中,我使用数组进行微型优化; 如果您使用索引器/for格式,那么数组可能稍微快一些,但我记得它取决于数组中的数据类型。 但是,除非您需要微调优化,否则请保持简单并使用List 等。

当然,只有在您阅读所有数据时才适用; 对于基于密钥的查找,字典将更快。

以下是使用int的结果(第二个数字是用于验证它们都执行了相同工作的校验和):

(编辑以修复错误)

List/for: 1971ms (589725196)
Array/for: 1864ms (589725196)
List/foreach: 3054ms (589725196)
Array/foreach: 1860ms (589725196)

基于测试装置:

using System;
using System.Collections.Generic;
using System.Diagnostics;
static class Program
{
    static void Main()
    {
        List list = new List(6000000);
        Random rand = new Random(12345);
        for (int i = 0; i < 6000000; i++)
        {
            list.Add(rand.Next(5000));
        }
        int[] arr = list.ToArray();
        int chk = 0;
        Stopwatch watch = Stopwatch.StartNew();
        for (int rpt = 0; rpt < 100; rpt++)
        {
            int len = list.Count;
            for (int i = 0; i < len; i++)
            {
                chk += list[i];
            }
        }
        watch.Stop();
        Console.WriteLine("List/for: {0}ms ({1})", watch.ElapsedMilliseconds, chk);
        chk = 0;
        watch = Stopwatch.StartNew();
        for (int rpt = 0; rpt < 100; rpt++)
        {
            for (int i = 0; i < arr.Length; i++)
            {
                chk += arr[i];
            }
        }
        watch.Stop();
        Console.WriteLine("Array/for: {0}ms ({1})", watch.ElapsedMilliseconds, chk);
        chk = 0;
        watch = Stopwatch.StartNew();
        for (int rpt = 0; rpt < 100; rpt++)
        {
            foreach (int i in list)
            {
                chk += i;
            }
        }
        watch.Stop();
        Console.WriteLine("List/foreach: {0}ms ({1})", watch.ElapsedMilliseconds, chk);
        chk = 0;
        watch = Stopwatch.StartNew();
        for (int rpt = 0; rpt < 100; rpt++)
        {
            foreach (int i in arr)
            {
                chk += i;
            }
        }
        watch.Stop();
        Console.WriteLine("Array/foreach: {0}ms ({1})", watch.ElapsedMilliseconds, chk);
        Console.ReadLine();
    }
}

0