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