加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 为什么AddRange比使用foreach循环更快?

发布时间:2020-12-16 01:22:15 所属栏目:百科 来源:网络整理
导读:var fillData = new Listint();for (var i = 0; i 100000; i++){ fillData.Add(i);}var stopwatch1 = new Stopwatch();stopwatch1.Start();var autoFill = new Listint();autoFill.AddRange(fillData);stopwatch1.Stop();var stopwatch2 = new Stopwatch();s
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>,那么两者将花费大约相同的时间.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读