疯了 List.AddRange比foreach慢很多

ChargeForward 2010-07-30 03:53:43
谁能给我 List.AddRange的源代码

10W次压力测试得出 它比foreach慢了很多很多

this.Clauses.AddRange(conds);

foreach (var cond in conds)
{
this.Clauses.Add(cond);
}
...全文
731 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
兔子-顾问 2010-08-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 huminghua 的回复:]
楼主说的是10W次吧!没有说counds是10W吧!
[/Quote]
描述准确,一针见血。
xxfxiazai 2010-08-06
  • 打赏
  • 举报
回复
貌似是这样,楼主说的10W次是

this.Clauses.AddRange(conds); AddRange执行了10W次

foreach (var cond in conds) foreach 10W次
{
this.Clauses.Add(cond); 执行了(10W X conds的长度)次
}


而 yixianggao 说的是

this.Clauses.AddRange(conds); AddRange执行了1次 conds的长度是10W

foreach (var cond in conds) foreach 10W次
{
this.Clauses.Add(cond); 还是10W 次
}


而下面那种才是正确的测试方法。

不知道是不是这个意思。。
SK_Aqi 2010-08-06
  • 打赏
  • 举报
回复
学习下,怎么回事?
alan001 2010-08-06
  • 打赏
  • 举报
回复
关注

支持一下楼主
秦风51 2010-08-06
  • 打赏
  • 举报
回复
测了下 还是AddRange 快....

static void Main(string[] args)
{
const string head = "test headtest headtest headtest headtest headtest head";
List<string> sourceList = new List<string>();
for (int i = 0; i < 1000000; i++)
{
sourceList.Add(head + i.ToString());
}

List<string> dest1 = new List<string>();
List<string> dest2 = new List<string>();

DateTime tTime = DateTime.Now;
Console.WriteLine("{0}:{1}:{2}:{3}", tTime.Hour, tTime.Minute, tTime.Second, tTime.Millisecond);
dest1.AddRange(sourceList);
tTime = DateTime.Now;
Console.WriteLine("{0}:{1}:{2}:{3}", tTime.Hour, tTime.Minute, tTime.Second, tTime.Millisecond);
Console.WriteLine("++++++++++++++++++++++++++++++++++++++++");
tTime = DateTime.Now;
Console.WriteLine("{0}:{1}:{2}:{3}", tTime.Hour, tTime.Minute, tTime.Second, tTime.Millisecond);
foreach (var t in sourceList)
{
dest2.Add(t);
}
tTime = DateTime.Now;
Console.WriteLine("{0}:{1}:{2}:{3}", tTime.Hour, tTime.Minute, tTime.Second, tTime.Millisecond);

}
hytwl 2010-08-06
  • 打赏
  • 举报
回复
支持。。。
yixianggao 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 chargeforward 的回复:]
现在的测试结果

AddRange(10w)
要比
foreach (var cond in 10w)
{
this.Clauses.Add(cond);
}

慢很多....

这就无语了
[/Quote]
这说明 lz 根本没有读懂我的回帖,我的代码与 lz 的测试情况完全不同,
如果 lz 能看明白不同点的话,那么就请结贴吧!
huminghua 2010-07-30
  • 打赏
  • 举报
回复
说的夸张了点吧!
huminghua 2010-07-30
  • 打赏
  • 举报
回复
楼主说的是10W次吧!没有说counds是10W吧!
ChargeForward 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yixianggao 的回复:]

不用看源码,基本上能猜到,里面应该有内存计算及分配操作,
频繁调用 AddRange 的效率肯定不如 Add!

但是,AddRange(10w)
要比
foreach (var cond in 10w)
{
this.Clauses.Add(cond);
}
的速度快!

是 lz 的思路有问题,AddRange 没问题!
[/Quote]

现在的测试结果

AddRange(10w)
要比
foreach (var cond in 10w)
{
this.Clauses.Add(cond);
}

慢很多....

这就无语了
凤凰涅檠 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yixianggao 的回复:]
今天会写代码的程序员很多很多,而懂代码的程序员却很少很少!
[/Quote]

up~~~~~~~~
yixianggao 2010-07-30
  • 打赏
  • 举报
回复
今天会写代码的程序员很多很多,而懂代码的程序员却很少很少!
叶子 2010-07-30
  • 打赏
  • 举报
回复
慢是可以理解的,慢很多就不好理解了。
yixianggao 2010-07-30
  • 打赏
  • 举报
回复
呵呵,真把源码贴出来,问题根本不在源码上面!

问题在于 lz 根本没有真正弄明白 Add 和 AddRange 的区别!
zhubo006 2010-07-30
  • 打赏
  • 举报
回复
wuyq11 2010-07-30
  • 打赏
  • 举报
回复
yixianggao 2010-07-30
  • 打赏
  • 举报
回复
不用看源码,基本上能猜到,里面应该有内存计算及分配操作,
频繁调用 AddRange 的效率肯定不如 Add!

但是,AddRange(10w)
要比
foreach (var cond in 10w)
{
this.Clauses.Add(cond);
}
的速度快!

是 lz 的思路有问题,AddRange 没问题!
小_虎 2010-07-30
  • 打赏
  • 举报
回复
symbol_bc 2010-07-30
  • 打赏
  • 举报
回复

public virtual void AddRange(ICollection c)
{
this.InsertRange(this._size, c);
}


public virtual void InsertRange(int index, ICollection c)
{
if (c == null)
{
throw new ArgumentNullException("c", Environment.GetResourceString("ArgumentNull_Collection"));
}
if ((index < 0) || (index > this._size))
{
throw new ArgumentOutOfRangeException("index", Environment.GetResourceString("ArgumentOutOfRange_Index"));
}
int count = c.Count;
if (count > 0)
{
this.EnsureCapacity(this._size + count);
if (index < this._size)
{
Array.Copy(this._items, index, this._items, index + count, this._size - index);
}
object[] array = new object[count];
c.CopyTo(array, 0);
array.CopyTo(this._items, index);
this._size += count;
this._version++;
}
}

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧