C # требует больших вычислительных затрат, как сделать это быстрее

#c# #.net #performance #multidimensional-array

#c# #.net #Производительность #многомерный массив

Вопрос:

Я знаю, что задавать глупый вопрос о том, почему этот code minX требует больших вычислительных затрат, но я подумал, что кто-нибудь может сообщить мне о моей ошибке. Спасибо

 // getMap is a 2 dimentional array of type short I need to find maxX,minX,maxY,minY 
//Can't use Math.Min , as it will get the lower bound i.e 0, i want values after filtering
for (int X = 0; X < getMap.GetLength(0); X  )
{       
    for (int Y = 0; Y < getMap.GetLength(1); Y  )
    {           
        if((short)getMap.GetValue(X,Y) !=  0)
        {
           //if i take it out, it works fine ,I need to 
            if (minX > X )
                minX = X;
            else
                X = minX;
        // Prints some stuff and does other computation 
        }
    }
}
// Draws image 
  

Комментарии:

1. Это требует больших вычислительных затрат, потому что выполняется итерация по каждому элементу в 2D-массиве. Что еще вы ищете?

2. Почему вы меняете значение переменной цикла X внутри внутреннего цикла?

3. Это поможет получить ответ на ваш вопрос: напишите таблицу значений в вашем 2D-массиве. Тогда дайте нам знать, что вы ищете в результате. Просто для начала…

4. «Требует больших вычислительных затрат» — это хорошее преуменьшение для «не завершается».

Ответ №1:

else X = minX; часть не имеет особого смысла. Это может привести к бесконечному циклу, потому что вы возвращаете переменной цикла X меньшее значение.

Ваш код завершится, только если не более 1 столбца содержит ненулевое значение (при условии, что вы инициализировали minX большим значением).

Например, предположим, что и X=0 , и X=1 столбец где-то содержат ненулевое значение. Затем, когда он достигает ненулевого значения в столбце 0 minX , устанавливается равным 0. Затем позже он получает ненулевое значение с X=1 уведомлениями, что minX>X равно false, и возвращает X обратно в 0. И повторять вечно.

Комментарии:

1. Казалось бы, в большинстве случаев это создало бы бесконечный цикл.

Ответ №2:

Я не знаю, как (short)getMap.GetValue(X,Y) сравнить с just getmap[X,Y] , но это кажется чрезмерно сложным.

Что вы можете сделать, так это заменить short[,] getMap на short[][] getMap .

Массив из массива (неровные массивы) обычно выполняется быстрее в этих сценариях вложенного цикла, потому что дрожание может лучше оптимизировать проверку диапазона.

Комментарии:

1. Я бы предположил, что getMap.GetValue это приводит к тому, что каждый элемент помещается в коробку, а затем приведение разархивирует его. Если значений много, все эти операции по упаковке / распаковке потребуют много циклов процессора.

2. GetMap() имеет значение, я отфильтровываю все, что больше 0, для использования при вычислении минимальных и максимальных значений

3. @Don: Да, у него есть значение, но это не причина вызывать GetValue() . Но сначала прочитайте ответ Chaos. Ваш код испорчен.

4. Спасибо, ребята, заменили его minX = Math.Min(minX, X); minY = Math.Min(minY, Y); maxX = Math.Max(maxX, X); maxY = Math.Max(maxY, Y);