Распараллеливание рекурсивного метода - C#

Узнай цену своей работы

Формулировка задачи:

Реализую метод медианного сечения квантования изображений: http://www.intuit.ru/studies/courses/993/163/lecture/4513?page=3 Если кратко о его сути: сортируем массив пикселей по цветовому каналу с наибольшей разницей минимального и максимального значения, делим массив пополам и делаем то же самое с этими половинками, пока в итоге не массивов будет не столько, сколько нам нужно цветов, и потом усредняем значения цветовых каналов в каждом из этих массивов. Сейчас метод выглядит так:
private static void Algorithm(Pixel[] array)
        {
       
            if (array.Length <= ArrayLen / 65536)
            {
                //усреднение значений цветовых каналов в массиве и их вывод за пределы функции
            }
 
            else
            {
                Pixel[] newArray1 = new Pixel[array.Length / 2],
                newArray2 = new Pixel[array.Length / 2];

                SortPixels(ref array, GetSortOrder(array)); //сортировка массива по каналу с наибольшим range
 
                newArray1 = array.Take(array.Length / 2).ToArray();
                newArray2 = array.Skip(array.Length / 2).ToArray();

                Task thread1 = Task.Factory.StartNew(() =>
                {
                    Algorithm(newArray1);
                });
                Task thread2 = Task.Factory.StartNew(() =>
                {
                    Algorithm(newArray2);
                });

            }
        }
Производительностью доволен: всё работает очень быстро (всего 7 секунд для 4к изображения не на самом сильном ноутбучном процессоре); но почему-то приложение продолжает выполняться после даже вывода изображения (которое происходит после вызова функции) и кушать память в течение достаточно долгого времени. Что я делаю не так?

Решение задачи: «Распараллеливание рекурсивного метода»

textual
Листинг программы
private static async Task Algorithm(Pixel[] array)
{
    for (int segmentLength = array.Length; segmentLength > ArrayLen / 65536; segmentLength /= 2)
    {
        var sortTasks = new List<Task>();
        for (int startIndex = 0; startIndex < array.Length; startIndex += segmentLength)
        {
            int partitionEndIndex = Math.Min(array.Length, startIndex + segmentLength);
            sortTasks.Add(Task.Run(() => SortPixels(array, startIndex, partitionEndIndex, GetSortOrder(array, startIndex, partitionEndIndex)))); //сортировка массива по каналу с наибольшим range)
        }
 
        await Task.WhenAll(sortTasks);
    }
 
    //усреднение значений цветовых каналов в массиве и их вывод за пределы функции
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.067 из 5
Похожие ответы