Я реализую алгоритмы обработки изображений в C #, используя .NET Framework 4.72, и мне нужно уменьшить вычислительный код.В целом код является последовательным, но существует довольно много методов с параметрами, которые не зависят друг от друга.Например, это может быть что-то вроде
public void Algorithm(Object x, Object y) {
x = Filter(x);
x = Morphology(x);
y = Filter(y);
y = Morphology(y);
var z = Add(x,y);
//Similar pattern of separate operation that are then combined.
}
Эти функции обычно занимают от 100 до 500 мс.Они могут быть распараллелены, и мой подход был примерно таким:
public void Algorithm(Object x, Object y) {
var xTask = Task.Run(() => {
x = Filter(x);
x = Morphology(x);
});
var yTask = Task.Run(() => {
y = Filter(y);
y = Morphology(y);
});
Task.WaitAll(xTask, yTask);
var z = Add(x,y);
}
Кажется, работает, аналогичный фрагмент кода выполняется примерно вдвое быстрее.(Обратите внимание, что все это обернуто в другой Task.Run
в функции самого верхнего уровня, поэтому я не await
здесь.
Вопрос: Это правильный подход илиЕсть ли другой метод для распараллеливания множества небольших вызовов методов, который является более безопасным или эффективным?
Обновление: это не для распараллеливания обработки пакета изображений. Речь идет об обработке одного изображения как можно быстрее.