测试表明,最佳性能使用 .ToList() 方法(对于具有 21474836 个元素的列表,它在笔记本电脑 Core i5 CPU 上运行大约 48 毫秒)。
其他所有方法都比较慢,使用.Add()的方法最差,同时谈论性能。
这是一些测试代码:
class Program
{
static void Main()
{
var list = new List<int>();
for (int i = 0; i < int.MaxValue / 100; i++)
{
list.Add(i);
}
TimeItAccurate(ListCopy_1, list, 10);
TimeItAccurate(ListCopy_2, list, 10);
TimeItAccurate(ListCopy_3, list, 10);
TimeItAccurate(ListCopy_4, list, 10);
TimeItAccurate(ListCopy_5, list, 10);
}
private static List<int> ListCopy_1(List<int> list)
{
var newList = list.ToList();
return newList;
}
private static List<int> ListCopy_2(List<int> list)
{
var newList = new List<int>(list.Count);
foreach (var i in list)
{
newList.Add(i);
}
return newList;
}
private static List<int> ListCopy_3(List<int> list)
{
var newList = new List<int>(list.ToArray());
return newList;
}
private static List<int> ListCopy_4(List<int> list)
{
var newList = new List<int>(list.Count);
newList.AddRange(list);
return newList;
}
private static List<int> ListCopy_5(List<int> list)
{
var newList = new List<int>(list);
return newList;
}
public static void TimeItAccurate<TIn, TResult>(Func<TIn, TResult> func, TIn argument, int iterationsCount)
{
#region Pre-heat
for (int i = 0; i < 10; i++)
{
var t = func.Invoke(argument);
}
#endregion
var stopwatch = new Stopwatch();
var result = default(TResult);
stopwatch.Start();
for (int i = 0; i < iterationsCount; i++)
{
result = func.Invoke(argument);
}
stopwatch.Stop();
Console.WriteLine("Result:\n{4}(...) == {0}\n\n{1} iterations done in {2} ms.\nAverage time: {3:f5} ms.",
result,
iterationsCount,
stopwatch.ElapsedMilliseconds,
stopwatch.ElapsedMilliseconds / (double)iterationsCount,
func.Method.Name);
}
}
结果:
Result (.ToList()):
ListCopy_1(...) == System.Collections.Generic.List`1[System.Int32]
10 iterations done in 474 ms.
Average time: 47.40000 ms.
Result (for-cycle with .Add()):
ListCopy_2(...) == System.Collections.Generic.List`1[System.Int32]
10 iterations done in 1896 ms.
Average time: 189.60000 ms.
Result (ctor with .ToArray()):
ListCopy_3(...) == System.Collections.Generic.List`1[System.Int32]
10 iterations done in 981 ms.
Average time: 98.10000 ms.
Result (.AddRange()):
ListCopy_4(...) == System.Collections.Generic.List`1[System.Int32]
10 iterations done in 959 ms.
Average time: 95.90000 ms.
Result (new List<int>(list)):
ListCopy_5(...) == System.Collections.Generic.List`1[System.Int32]
10 iterations done in 480 ms.
Average time: 48.00000 ms.