.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();
}
}
}
}