将数据添加到集合中,效率更高

本文关键字:效率 集合 数据 添加 | 更新日期: 2023-09-27 17:56:18

我正在向集合添加数据,但我不知道哪个更有效。

使用foreach循环,

internal class CollectionClass
{
    public List<string> ListData { get; set; }
    public CollectionClass()
    {
        ListData = new List<string>();
        string[] names = { "Matt", "Joanne", "Robert" };
        foreach (var item in names)
        {
            ListData.Add(item);
        }
    }
}

还是这样更有效率?

internal class CollectionClass
{
    public List<string> ListData { get; set; }
    public CollectionClass()
    {           
        ListData.Add("Matt");
        ListData.Add("Joanne");
        ListData.Add("Robert");
    }
 }

所有的逻辑都表明是后者,但大数据是这样吗?

将数据添加到集合中,效率更高

除非您添加数百万个条目,否则没有太大区别,因此请选择您更熟悉的代码。

这是 4 种不同方式的基准。

1)带循环的数组(如第一种方法)。

2) 带AddRange的数组。几乎相同,但代码更好一些。

3)使用Add(如第二种方法)。

4) 使用列表初始值设定项。

可悲的是,我不能运行每个测试超过 10,000 次,因为 dotnetfiddle.net 会给出内存错误,但您可以复制代码并在数字更高的计算机上尝试,例如 100,000。无论如何,结果是 1 和 2 几乎相同,并且比非常接近的 3 和 4 更快。但是您可以清楚地看到,即使在插入 10,000 次时,差异也很小 3 个项目。所以真的可以忽略不计。

链接到小提琴演示

测试结果(以毫秒为单位):

测试1:6

测试2:6

测试3: 2

测试4: 2

测试代码:

using System;
using System.Collections.Generic;
public class Program
{
    public static void Main()
    {
        var c = new CollectionClass();
        var watch = System.Diagnostics.Stopwatch.StartNew();
        for (var i = 0; i < 10000; i++)
            c.Test1();
        watch.Stop();
        Console.WriteLine("Test1:" + watch.ElapsedMilliseconds);
        watch = System.Diagnostics.Stopwatch.StartNew();
        for (var i = 0; i < 10000; i++)
            c.Test2();
        watch.Stop();
        Console.WriteLine("Test2:" + watch.ElapsedMilliseconds);
        watch = System.Diagnostics.Stopwatch.StartNew();
        for (var i = 0; i < 10000; i++)
            c.Test3();
        watch.Stop();
        Console.WriteLine("Test3:" + watch.ElapsedMilliseconds);
        watch = System.Diagnostics.Stopwatch.StartNew();
        for (var i = 0; i < 10000; i++)
            c.Test4();
        watch.Stop();
        Console.WriteLine("Test4:" + watch.ElapsedMilliseconds);
    }
}
internal class CollectionClass
{
    public List<string> ListData { get; set; }
    public void Test1()
    {
        ListData = new List<string>();
        string[] names = { "Matt", "Joanne", "Robert" };
        foreach (var item in names)
            ListData.Add(item);
    }
    public void Test2()
    {
        string[] names = { "Matt", "Joanne", "Robert" };
        ListData = new List<string>();
        ListData.AddRange(names);
    }
    public void Test3()
    {
        ListData = new List<string>();
        ListData.Add("Matt");
        ListData.Add("Joanne");
        ListData.Add("Robert");
    }
    public void Test4()
    {
        ListData = new List<string>(){ "Matt", "Joanne", "Robert" };
    }
}