var fillData = new List<int>(); for (var i = 0; i < 100000; i++) { fillData.Add(i); } var stopwatch1 = new Stopwatch(); stopwatch1.Start(); var autoFill = new List<int>(); autoFill.AddRange(fillData); stopwatch1.Stop(); var stopwatch2 = new Stopwatch(); stopwatch2.Start(); var manualFill = new List<int>(); foreach (var i in fillData) { manualFill.Add(i); } stopwatch2.Stop();
当我从stopwach1和stopwach2获取4个结果时,stopwatch1的值始终低于stopwatch2.这意味着addrange总是比foreach更快.
有谁知道为什么? 潜在地,AddRange可以检查传递给它的值在何处实现IList或IList< T>.如果是这样,它可以找出该范围内有多少值,因此需要分配多少空间……而foreach循环可能需要重新分配几次.另外,即使在分配之后,List< T>可以使用IList<T>.CopyTo
来执行批量复制到底层数组(当然,对于实现IList< T>的范围).
我怀疑你会发现,如果你再次尝试测试,但是使用Enumerable.Range(0,100000)来表示fillData而不是List< T>,那么两者将花费大约相同的时间.
精彩评论