.NET 4.x Parallel.ForEach даёт небольшой прирост производительности - C#

Узнай цену своей работы

Формулировка задачи:

Parallel.ForEach даёт небольшой прирост производительности в сравнении с одно поточной версией всего в 1,5 - 1,8 раз. Причем проц поддерживает 8 потоков. В чём может быть косяк?
Листинг программы
  1. private readonly float[] _wm; // минимальный размер который встречался ~78 000 000
  2. // _wm заполняется при инициализации объекта в котором всё это
  3. public void Sub(float v, float d, float[] x)
  4. {
  5. var rangePartitioner = Partitioner.Create(0, _wm.Length,
  6. _wm.Length / Environment.ProcessorCount);
  7. Parallel.ForEach(rangePartitioner, (range, loopState) =>
  8. {
  9. for (var i = range.Item1; i < range.Item2; i++)
  10. {
  11. _wm[i] += v * d * x[i];
  12. }
  13. });
  14. }

Решение задачи: «.NET 4.x Parallel.ForEach даёт небольшой прирост производительности»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Concurrent;
  3. using System.Diagnostics;
  4. using System.Threading;
  5. using System.Threading.Tasks;
  6.  
  7. namespace ThreadsTest
  8. {
  9.     class Program
  10.     {
  11.         private static float[] _wm; // минимальный размер который встречался ~78 000 000
  12.                                     // _wm заполняется при инициализации объекта в котором всё это
  13.  
  14.         public static void AuthorsSub(float v, float d, float[] x)
  15.         {
  16.             var rangePartitioner = Partitioner.Create(0, _wm.Length,
  17.                           _wm.Length / Environment.ProcessorCount);
  18.             Parallel.ForEach(rangePartitioner, (range, loopState) =>
  19.             {
  20.                 for (var i = range.Item1; i < range.Item2; i++)
  21.                 {
  22.                     _wm[i] += v * d * x[i];
  23.                 }
  24.             });
  25.         }
  26.  
  27.         public static void FreebaSub(float v, float d, float[] x)
  28.         {
  29.             Parallel.For(0, _wm.Length, i =>
  30.             {
  31.                 _wm[i] = v*d*x[i];
  32.             });
  33.         }
  34.  
  35.         static void Main(string[] args)
  36.         {
  37.             System.Threading.Thread.CurrentThread.Priority = ThreadPriority.Highest;
  38.             Stopwatch sw;
  39.             int size = 120 * 1000 * 1000;
  40.             _wm = new float[size];
  41.             var x = new float[size];
  42.  
  43.             AuthorsSub(1.4f, 6.3f, x);
  44.             FreebaSub(1.4f, 6.3f, x);
  45.  
  46.             Randomize(_wm, x);
  47.             Console.WriteLine(nameof(AuthorsSub));
  48.             sw = Stopwatch.StartNew();
  49.             AuthorsSub(1.4f, 6.3f, x);
  50.             Console.WriteLine(sw.Elapsed);
  51.             Console.WriteLine();
  52.  
  53.             Randomize(_wm, x);
  54.             Console.WriteLine(nameof(FreebaSub));
  55.             sw = Stopwatch.StartNew();
  56.             FreebaSub(1.4f, 6.3f, x);
  57.             Console.WriteLine(sw.Elapsed);
  58.             Console.WriteLine();
  59.         }
  60.  
  61.         private static void Randomize(float[] wm, float[] x)
  62.         {
  63.             var rand = new Random();
  64.             for (int i = 0; i < wm.Length; i++)
  65.             {
  66.                 wm[i] = rand.Next();
  67.                 x[i] = rand.Next();
  68.             }
  69.         }
  70.     }
  71. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.286 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы