Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2010, 13:16   #1
n00n
Новичок
Джуниор
 
Регистрация: 10.06.2010
Сообщений: 4
По умолчанию Время выполнения

Добрый день
Странная проблема-пытаюсь разобраться с алгоритмами обработки изображений,сейчас пишу гауссовское размытие
И вылазит очень большое время исполнения
вот этот код

Код:
for(int i = -KNN_WINDOW_RADIUS; i <= KNN_WINDOW_RADIUS; i++)
            for(int j = -KNN_WINDOW_RADIUS; j <= KNN_WINDOW_RADIUS; j++)
            {
				weight=expf( - ((i * i + j * j) * INV_KNN_WINDOW_AREA) );
				if((((ix+i)<rows)&((iy+j)<cols))&(((ix+i)>0)&((iy+j)>0)))
				acc += (zxc[ix+i][iy+j]);
исполняется за 53 миллисекунды
стоит добавить в последнюю строку умножение
Код:
acc += (zxc[ix+i][iy+j])*weight;
время исполнения становится 650 миллисекунд.
Несмотря на то что описанный кусок сам крутится пару тысяч раз,я подозреваю что время выполнения не должно так сильно возрастать.
Так и должно быть?
n00n вне форума Ответить с цитированием
Старый 10.06.2010, 13:26   #2
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Код:
for(int i = -KNN_WINDOW_RADIUS; i <= KNN_WINDOW_RADIUS; i++)
            for(int j = -KNN_WINDOW_RADIUS; j <= KNN_WINDOW_RADIUS; j++)
            {
				if((((ix+i)<rows)&&((iy+j)<cols))&&(((ix+i)>0)&&((iy+j)>0)))
{
				weight=expf( - ((i * i + j * j) * INV_KNN_WINDOW_AREA) );
				acc += (zxc[ix+i][iy+j]);

}
так попробуй, выиграешь еще немного времени
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 10.06.2010, 13:34   #3
n00n
Новичок
Джуниор
 
Регистрация: 10.06.2010
Сообщений: 4
По умолчанию

вопрос в том,почему время выполнения увеличивается в 10 раз при добавлении умножения acc += (zxc[ix+i][iy+j])*weight;.
любые другие операции произвожу-время не увеличивается почти.
например weight*=weight время увеличивает буквально на 1 мс
n00n вне форума Ответить с цитированием
Старый 10.06.2010, 13:56   #4
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Вообще говоря такого быть не должно
Код:
weight*=weight
выполнялся бы чаще. А какие типы имеют переменные?
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 10.06.2010, 14:05   #5
n00n
Новичок
Джуниор
 
Регистрация: 10.06.2010
Сообщений: 4
По умолчанию

переменные float
n00n вне форума Ответить с цитированием
Старый 10.06.2010, 14:22   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

2n00n
Код:

for(int i = -KNN_WINDOW_RADIUS; i <= KNN_WINDOW_RADIUS; i++)
            for(int j = -KNN_WINDOW_RADIUS; j <= KNN_WINDOW_RADIUS; j++)
            {
				weight=expf( - ((i * i + j * j) * INV_KNN_WINDOW_AREA) );
				if((((ix+i)<rows)&((iy+j)<cols))&(((ix+i)>0)&((iy+j)>0)))
				acc += (zxc[ix+i][iy+j])*weight;
скорее всего, когда умножения нет, то компилятор игнорирует расчет формулы, ибо далее ее результат нигде не используется (судя твоему куску кода)
Цитата:
weight=expf( - ((i * i + j * j) * INV_KNN_WINDOW_AREA) );
а когда ты его подставил, то эта формула уже используется. а тут, как сам видишь, вызывается expf. вот и все
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 10.06.2010, 14:23   #7
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Попробуй так:
Код:
				if((((ix+i)<rows)&&((iy+j)<cols))&&(((ix+i)>0)&&((iy+j)>0)))
				{
				//weight=expf( - ((i * i + j * j) * INV_KNN_WINDOW_AREA) );
				acc += (zxc[ix+i][iy+j])*expf( - ((i * i + j * j) * INV_KNN_WINDOW_AREA) );;

				}[/
pproger поддерживаю
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 10.06.2010, 15:05   #8
n00n
Новичок
Джуниор
 
Регистрация: 10.06.2010
Сообщений: 4
По умолчанию

верно!
спасибо
n00n вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Время выполнения макроса... nikolai_P Microsoft Office Excel 9 03.04.2013 00:59
Время выполнения программы Zhamie Общие вопросы Delphi 8 15.09.2009 15:26
Разбить время выполнения скрипта iankov PHP 9 03.08.2009 09:10
Время выполнения Goodwin98 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 16 21.06.2009 08:41
Посчитать время выполнения процедуры SeЯgey Помощь студентам 1 24.05.2009 18:38