Слишком большое время работы для маленького цикла - C#
Формулировка задачи:
Я реализую алгоритм SURF.
Имеется уже заполненная матрица яркостей, где lockBitmap.Width и lockBitmap.Height - ширина и высота изображения в пикселях. Эта матрица заполняется быстро с помощью маршалинга.
И есть простенький код, который вычисляет интегральное представление изображения (матрица тех же размеров, где каждый элемент - сумма яркостей всех пикселей, левее и выше текущего):
Для изображения размером 50Х50 пикселей код работает шустро. Но для изображения 300Х300 требуется почти минута времени. С чем может быть связано такое большое время, если я просто гуляю по небольшому, уже заполненному массиву и просто беру из него числа?
double[,] BrightMatrix = new double[lockBitmap.Width, lockBitmap.Height];
for (int x = 0; x < lockBitmap.Width; x++)
{
for (int y = 0; y < lockBitmap.Height; y++)
{
double Sum = 0;
for (int k = 0; k <= x; k++)
{
for (int l = 0; l <= y; l++)
{
Sum += BrightMatrix[k, l];
}
}
IntegralMatrix[x, y] = Sum;
}
}Решение задачи: «Слишком большое время работы для маленького цикла»
textual
Листинг программы
for (int x = 0; x < source.Width; x++)
{
for (int y = 0; y < source.Height; y++)
{
if (x == 0 && y == 0) { IntegralMatrix[x, y] = BrightMatrix[x, y]; }
else if (y == 0) { IntegralMatrix[x, y] = BrightMatrix[x, y] + IntegralMatrix[x - 1, y]; }
else if (x == 0) { IntegralMatrix[x, y] = BrightMatrix[x, y] + IntegralMatrix[x, y - 1]; }
else { IntegralMatrix[x, y] = BrightMatrix[x, y] + IntegralMatrix[x - 1, y] + IntegralMatrix[x, y - 1] - IntegralMatrix[x - 1, y - 1]; }
}
}