您现在的位置是:首页» 软件教程» foreach和while的区别,foreach和foreach的区别

foreach和while的区别,foreach和foreach的区别

2024-04-12 02:13:45
今天小编为大家分享Windows系统下载、Windows系统教程、windows相关应用程序的文章,希望能够帮助到大家!   当你需要为多核机器进行优化时,最好先检查一下你的程序是否有可以进行分割并行处理的任务。比如说,如果有一个巨大的数据集合,其中的元素需要一个个地进行彼此独立的耗时计算。在 .NET

今天小编为大家分享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