【发布时间】:2011-08-27 12:37:00
【问题描述】:
代码如下:
using (var context = new AventureWorksDataContext())
{
IEnumerable<Customer> _customerQuery = from c in context.Customers
where c.FirstName.StartsWith("A")
select c;
var watch = new Stopwatch();
watch.Start();
var result = Parallel.ForEach(_customerQuery, c => Console.WriteLine(c.FirstName));
watch.Stop();
Debug.WriteLine(watch.ElapsedMilliseconds);
watch = new Stopwatch();
watch.Start();
foreach (var customer in _customerQuery)
{
Console.WriteLine(customer.FirstName);
}
watch.Stop();
Debug.WriteLine(watch.ElapsedMilliseconds);
}
问题是,Parallel.ForEach 大约需要 400 毫秒,而普通的 foreach 大约需要 40 毫秒。我到底做错了什么,为什么它没有按我的预期工作?
【问题讨论】:
-
基本上是因为涉及设置成本,并且您在循环内没有做足够的工作来证明开销是合理的。参见例如this answer。 (我希望这是一个重复的问题。)
-
Console.WriteLine()使其完全无关紧要。 -
尝试删除
Console.WriteLine()并用c.FirstName = c.FirstName.ToLowerInvariant()替换它。如果您的收藏有大约 5000 件商品,您将不会看到差异;但是如果您的收藏有 6000、7000、... 10.000 件物品,在 4 核处理器上,您会看到很大的不同(Parallel.Foreach会更快)
标签: c# .net parallel.foreach