从第一台计算机问世到现在计算机硬件技术已经有了很大的发展。不管是现在个人使用的PC还是公司使用的服务器。双核,四核,八核的CPU已经非常常见。这样我们可以将我们程序分摊到多个计算机CPU中去计算,在过去并行化需要线程的低级操作,难度很大,在.net4.0中的增强了对并行化的支持,使得这一切变得非常简单 。本次我从以下几个方面大家讲以下.NET 并行
1. 数据并行
2. 任务并行
3. 并行Linq
4. 任务工厂
5. 注意事项
本次主要给大家讲一下数据并行 废话不说,下面开始了
数据并行其实就是指对原集合或者数组中的数据进行划区之后分摊到多个CPU或者多个线程执行相同的操作 在 .net中的 System.Threading.Tasks 提供了对数据并行的支持类 , Parallel.For,Parallel.ForEach和我们经常的使用的for 和foreach 十分的相似,你不用创建线程队列,在基本的循环中你不用使用锁。这些.net 会帮你处理,你只需要关注你自己的业务 那下面我们就来看看 Parallel.For 和 Parallel.ForEach 是如何使用的
• Parallel.For 简单使用
上面的例子是不是和我们经常使用的for循环的影子。 说一下 Parallel.For 的第三个参数Action
•对个list }, (x) => Interlocked.Add(ref sum, x));
Parallel.For
{
subsum += lista[j];
return subsum;
•在现实中我们也经常会遇到需要取消循环的情况。比如你在队列中查找一个数。那么如何退出Parallel.For 循环了。是不是也是和for 和foreach那样 使用Break关键字就可以了,答案否定的。这是因为break 构造对循环是有效的,而并行循环其实是一个方法,并不是循环 那么要怎么样取消了。请看下面的例子
subsum += lista[j];
return subsum;
}, (x) => Interlocked.Add(ref sum, x));
• 简单Parallel.ForEach 循环 Parallel.ForEach循环的工作方式类似于 Parallel.For 循环 根据系统环境,对源集合进行分区,并在多个线程上计划工作。 系统中的处理器越多,并行方法的运行速度越快。 对于某些源集合,顺序循环可能更快,具体取决于源的大小和正在执行的工作类型
不知道大家在这个地方有没有看到foreach的影子。其实上面的例子中的ForEach方法的最后一个输入参数是 Action
• Parallel.For 和for 性能测试比较 我们这里产生1千万个随机数为例子做个一个性能比较,在笔者的笔记本上结果如下 (可能在你的电脑上得到结果不一定相同)
附上相关的代码给大家参考
Parallel.For(0, listLength, i => {
Random r = new Random(100);
listTask.Add(r.Next());
});
Console.WriteLine("并行耗时:" + watch1.ElapsedMilliseconds );
Stopwatch watch2 = Stopwatch.StartNew();
for (int i = 0; i
Random r = new Random(100);
list.Add(r.Next());
}
Console.WriteLine("非并行耗时:" + watch2.ElapsedMilliseconds );