Найти максимальное число по модулю. Сравнить производительность без потоков, с потоками, и задачей - C#
Формулировка задачи:
Собственно говоря дали задание написать тремя способами поиск максимального числа. А именно без использования потоков, с использованием потоков, и использованием задачи. А да, запретили использовать PLINQ и класс Parallel.
Для начала создадим и заполним массив
Обычный поиск выглядит следующим образом
А вот с потоками вышла проблема. Есть идея создать массив потоков, и каждому назначить поиск макс элемента, правда возникают сложности с синхронизацией. Как "раздробить" наш массив на подзадачи, и сделать код потоко-безопасным.
Параллельный способ
Stopwatch для первого показывает 0.61милисекунд, а для второго способа 0,8
int[] numbers = new int[10000000];
Random rnd = new Random();
for (int i = 0; i < numbers.Length; i++)
numbers[i] = rnd.Next(int.MinValue + 1, int.MaxValue - 1); static int SearchMaxAbsNum(int[] numbers)
{
int max = Math.Abs(numbers[0]);
for (int i = 0; i < numbers.Length; i++)
if (max < Math.Abs(numbers[i]))
max = Math.Abs(numbers[i]);
return max;
}
Кстати говоря почему заполнение массива обычном способом будет медленнее чем параллельным
for (int i = 0; i < numbers.Length; i++)
numbers[i] = rnd.Next(int.MinValue + 1, int.MaxValue - 1); Parallel.For(
0,
numbers.Length,
i => numbers[i] = rnd.Next(int.MinValue + 1, int.MaxValue - 1)
);Решение задачи: «Найти максимальное число по модулю. Сравнить производительность без потоков, с потоками, и задачей»
textual
Листинг программы
public void SearchMaxNumWithTask()
{
var task = Task.Factory.StartNew(() =>
{
const int taskCount = 4;
for (int i = 0; i < taskCount; i++)
{
Task.Factory.StartNew(() =>
{
for (int j = i; j < numbers.Length; j += taskCount)
if (maxNum < Math.Abs(numbers[j]))
maxNum = Math.Abs(numbers[j]);
});
}
});
Task.WaitAll(task);
}