foreach和while的区别,foreach和foreach的区别
今天小编为大家分享Windows系统下载、Windows系统教程、windows相关应用程序的文章,希望能够帮助到大家!
当你需要为多核机器进行优化时,最好先检查一下你的程序是否有可以进行分割并行处理的任务。比如说,如果有一个巨大的数据集合,其中的元素需要一个个地进行彼此独立的耗时计算。在 .NET Framework 4 中,有两个工具可以帮助我们进行并行处理,它们分别是 Parallel.ForEach 和 PLINQ。
Parallel.ForEach 是 foreach 的多线程实现,它们都能对 IEnumerable 类型的对象进行遍历。但 Parallel.ForEach 的特殊之处在于它使用多线程来执行循环体内的代码段。该方法最常用的形式如下:
```csharp
public static ParallelLoopResult ForEach(IEnumerable source, Action body)
```
而 PLINQ 则是一种使用 LINQ 语法实现的多线程并行处理数据的编程模型。下面将探讨这两者的差别及适用的场景。
场景一:简单数据之独立操作的并行处理(使用 Parallel.ForEach)
如果需要处理的数据只是简单的独立操作,那么使用 Parallel.ForEach 是最合适不过的了。下面是一个示例代码:
```csharp
public static void IndependentAction(IEnumerable source, Action action)
{
Parallel.ForEach(source, element => action(element));
}
```
使用 Parallel.ForEach 的理由是:
1. 尽管 PLINQ 也提供了一个类似的 ForAll 接口,但它对于简单的独立操作来说太过重量化。
2. 使用 Parallel.ForEach,你还可以设定 ParallelOptions.MaxDegreeOfParallelism 参数,来指定最多需要多少个线程。这样,即使在 ThreadPool 资源匮乏的情况下(甚至可用线程数小于 MaxDegreeOfParallelism),Parallel.ForEach 仍然能够顺利运行。而且当后续有更多可用线程出现时,Parallel.ForEach 也能及时地利用这些线程。PLINQ 只能通过 WithDegreeOfParallelism 方法来要求固定的线程数,不能灵活地调整。
场景二:顺序数据之并行处理(使用 PLINQ 来维持数据顺序)
当需要保持输出的数据序列与原始顺序一致时,使用 PLINQ 的 AsOrdered 方法非常简单高效。下面是一个示例代码:
```csharp
public static void GrayscaleTransformation(IEnumerable Movie)
{
var ProcessedMovie = Movie.AsParallel().AsOrdered().Select(frame => ConvertToGrayscale(frame));
foreach (var grayscaleFrame in ProcessedMovie)
{
// Movie frames will be evaluated lazily
}
}
```
使用 PLINQ 的理由是:
Parallel.ForEach 的实现稍微复杂一些,首先你需要使用以下的重载方法:
```csharp
public static ParallelLoopResult ForEach(IEnumerable source, Action body)
```
这个重载的 Action 参数多了一个 index 参数,这样你就可以利用这个值来维持原先的序列顺序。请看下面的例子:
```csharp
public static double[] PairwiseMultiply(double[] v1, double[] v2)
{
var length = Math.Min(v1.Length, v2.Length);
double[] result = new double[length];
Parallel.ForEach(v1, (element, loopstate, elementIndex) => result[elementIndex] = element * v2[elementIndex]);
return result;
}
```
可能你已经意识到了这里有个明显的问题:我们使用了固定长度的数组。如果传入的是 IEnumerable,那么你有以下四个解决方案:
1. 调用 IEnumerable.Count() 方法来获取数据长度,然后用这个值实例化一个固定长度的数组,然后使用上例的代码。
2. 使用 ToArray() 方法将 IEnumerable 转换为数组,然后使用上例的代码。
3. 使用 List 来代替数组,然后在 Parallel.ForEach 中使用 index 来访问 List 中的元素。
4. 将 Parallel.ForEach 替换为 PLINQ 的 AsParallel().AsOrdered().ForAll()。
希望本文能够对你理解 Parallel.ForEach 和 PLINQ 的差别及适用场景有所帮助。无论是要进行简单的独立操作还是处理顺序数据,选择合适的并行处理工具都能够提高程序的性能。
wwW.Xtw.Com.cN系统网专业的PC、手机系统开发下载平台,HarmonyOS系统、安卓、OS、windows电脑重装系统在线下载安装,操作系统平台技术学习,攻略教程,技术交流。
免责声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。内容仅供参考使用,不准确地方联系删除处理!
联系邮箱:773537036@qq.com