我正在向集合添加数据,但我不知道哪个更有效。
使用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");
}
}
所有逻辑都暗示后者,但是大数据就是这种情况吗?
答案 0 :(得分:3)
除非您添加数百万条目,否则没有太大区别,因此请选择您更熟悉的代码。
以下是4种不同方式的基准。
1)带循环的数组(如第一种方法)。
2)带有AddRange
的数组。几乎相同,但代码更好一点。
3)使用Add
(如第二种方法)。
4)使用列表初始化器。
遗憾的是,我无法运行每次测试10,000次以上,因为dotnetfiddle.net会出现内存错误,但您可以复制代码并在计算机上尝试使用更高的数字(如100,000)。无论如何,结果是1和2几乎相同并且比3和4更快,这非常接近。但是你可以清楚地看到,即使在插入3个项目的10,000次时差异也很小。所以它真的可以忽略不计。
测试结果(以毫秒为单位):
测试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" };
}
}