我有一个简单的while循环
IEnumerable<Foo> collection;
while (!bc.IsCompleted)
{
collection = bc.Take();
}
bc 是一个BlockingCollection<IEnumerable<Foo>>
。bc 包含 9 个 IEnumerable 集合和总共 260 万个 Foo 对象。循环在我的机器上运行大约需要 640 毫秒。一旦我在 while 循环中的 Take() 之后添加一个 foreach 循环,运行时间就会爆炸到 2400 毫秒。
foreach(Foo foo in collection)
{
}
在我单独设置的 List 或 Foo[] 或 IEnumerable 中迭代超过 260 万个元素大约需要 54 毫秒。
如果我只是添加一个集合转换而不是 foreach 循环,则会发生同样的情况,例如
List<Foo> fooList = collection.ToList();
或者
Foo[] fooArray = collection.ToArray();
它突然也需要超过 2000 毫秒才能执行。
怎么会这样?我完全没有解释或可能的原因。谁能指出我在这里缺少的东西?速度变慢不能由锁定/阻塞引起,因为我没有更改在比较之间访问 BlockingCollection 的方式。
感谢您的任何意见。