Почему try/catch во вложенных циклах for существенно замедляет время выполнения?C#

Место общения программистов C#
Ответить
Anonymous
 Почему try/catch во вложенных циклах for существенно замедляет время выполнения?

Сообщение Anonymous »

Я работаю над инструментом для сегментации объектов из изображения в оттенках серого, и в рамках этого я хочу выполнить размытие по Гауссу. По сути, это способ узнать больше о C# и лежащих в его основе алгоритмах анализа изображений, поэтому я делаю это с нуля, а не использую существующие библиотеки.
Чтобы выполнить размытие по Гауссу, у меня есть три вложенных цикла for. Один проходит через каждую строку изображения, следующий проходит через каждый пиксель в строке, а третий выполняет свертку на основе ранее определенного ядра.
На этом этапе изображение представляет собой двумерный массив значений интенсивности размером 1024 x 1024.
Когда я использую операторы if для обнаружения ситуаций, когда я выхожу за пределы массива, время выполнения для каждой строки получается равным 0 мс, используя секундомер.

Код: Выделить всё

for (int y = 1; y < Height - 1; y++)
{
for (int x = 1; x < Width - 1; x++)
{
int NewValue = 0;
for (int i = 0; i < Kernel.Length; i++)
{
int Position = x + i - sigma * 3;
if (Position < 0 || Position > Width - 1)
{
NewValue += 0;
}
else
{
NewValue += (int)(SourceArray[y, Position] * Kernel[i]);
}
}
OutputArray[y, x] = NewValue;
}
Когда я пытаюсь заменить операторы if на try/catch, это время увеличивается примерно до 450 мс.

Код: Выделить всё

    for (int y = 1; y < Height - 1; y++)
{
for (int x = 1; x < Width - 1; x++)
{
int NewValue = 0;
for (int i = 0; i < Kernel.Length; i++)
{
int Position = x + i - sigma * 3;
try
{
NewValue += (int)(SourceArray[y, Position] * Kernel[i]);
}
catch (Exception e)
{
NewValue += 0;
}
}
OutputArray[y, x] = NewValue;
}
}
Некоторые поисковые запросы в Google предполагают, что попытка/уловить может привести к небольшому снижению производительности, но это кажется чрезмерным; на проверку if/else всего изображения уходит треть времени, чем на попытку/перехват одной строки. Есть ли что-то очевидное, что я делаю здесь неправильно? Или это именно то, что происходит, когда вы пытаетесь сделать миллион попыток/уловов?

Подробнее здесь: https://stackoverflow.com/questions/798 ... ecution-ti
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»