#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);