.NET 4.x Parallel.ForEach даёт небольшой прирост производительности - C#
Формулировка задачи:
Parallel.ForEach даёт небольшой прирост производительности в сравнении с одно поточной версией всего в 1,5 - 1,8 раз.
Причем проц поддерживает 8 потоков.
В чём может быть косяк?
private readonly float[] _wm; // минимальный размер который встречался ~78 000 000 // _wm заполняется при инициализации объекта в котором всё это public void Sub(float v, float d, float[] x) { var rangePartitioner = Partitioner.Create(0, _wm.Length, _wm.Length / Environment.ProcessorCount); Parallel.ForEach(rangePartitioner, (range, loopState) => { for (var i = range.Item1; i < range.Item2; i++) { _wm[i] += v * d * x[i]; } }); }
Решение задачи: «.NET 4.x Parallel.ForEach даёт небольшой прирост производительности»
textual
Листинг программы
using System; using System.Collections.Concurrent; using System.Diagnostics; using System.Threading; using System.Threading.Tasks; namespace ThreadsTest { class Program { private static float[] _wm; // минимальный размер который встречался ~78 000 000 // _wm заполняется при инициализации объекта в котором всё это public static void AuthorsSub(float v, float d, float[] x) { var rangePartitioner = Partitioner.Create(0, _wm.Length, _wm.Length / Environment.ProcessorCount); Parallel.ForEach(rangePartitioner, (range, loopState) => { for (var i = range.Item1; i < range.Item2; i++) { _wm[i] += v * d * x[i]; } }); } public static void FreebaSub(float v, float d, float[] x) { Parallel.For(0, _wm.Length, i => { _wm[i] = v*d*x[i]; }); } static void Main(string[] args) { System.Threading.Thread.CurrentThread.Priority = ThreadPriority.Highest; Stopwatch sw; int size = 120 * 1000 * 1000; _wm = new float[size]; var x = new float[size]; AuthorsSub(1.4f, 6.3f, x); FreebaSub(1.4f, 6.3f, x); Randomize(_wm, x); Console.WriteLine(nameof(AuthorsSub)); sw = Stopwatch.StartNew(); AuthorsSub(1.4f, 6.3f, x); Console.WriteLine(sw.Elapsed); Console.WriteLine(); Randomize(_wm, x); Console.WriteLine(nameof(FreebaSub)); sw = Stopwatch.StartNew(); FreebaSub(1.4f, 6.3f, x); Console.WriteLine(sw.Elapsed); Console.WriteLine(); } private static void Randomize(float[] wm, float[] x) { var rand = new Random(); for (int i = 0; i < wm.Length; i++) { wm[i] = rand.Next(); x[i] = rand.Next(); } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д