Найти максимальное число по модулю. Сравнить производительность без потоков, с потоками, и задачей - 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); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д