#c_sharp #многопоточность
Есть вложенный циклы, в результате они вызывают функцию для расчета данных, входными параметрами которой являются 2 параметра index в циклах. Как можно максимально эффективно реализовать распараллеливание прохода по циклам? По сути, я имею полный перебор двух параметров. double optResult = 0; double result = 0; for (int i = 5; i < 50; i = i + 5) { for (int j = 5; j < 50; j = j + 5) { if (i < j) { optResult = OptimStart(i,j); if (optResult > result) { result = optResult; } } } }
Ответы
Ответ 1
Я бы сделал как то так void Main() { var tuples = new List>(); for (int i = 5; i < 50; i = i + 5) { for (int j = i+5; j < 50; j = j + 5) { tuples.Add(Tuple.Create(i, j)); } } var max = tuples.AsParallel().Max(t=>Foo(t.Item1, t.Item2)); Console.WriteLine(max); } int Foo(int i, int j) { Thread.Sleep(1000); return i+j; } Если комбинаций слишком много и не хочется держать их в памяти, то void Main() { var max = GetItems().AsParallel().Max(t=>Foo(t.Item1, t.Item2)); Console.WriteLine(max); } int Foo(int i, int j) { Thread.Sleep(1000); return i+j; } IEnumerable > GetItems() { for (int i = 5; i < 50; i = i + 5) { for (int j = i + 5; j < 50; j = j + 5) { yield return Tuple.Create(i, j); } } } Ответ 2
Я бы единственное предложил бы вложенный цикл начинать не с 5, а с i + 5, и тогда внутреннее условие if (i < j) можно убрать: double optResult = 0; double result = 0; for (int i = 5; i < 50; i = i + 5) { for (int j = i + 5; j < 50; j = j + 5) { optResult = OptimStart(i,j); if (optResult > result) { result = optResult; } } }
Комментариев нет:
Отправить комментарий