Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Helldrg
26 / 55 / 1
Регистрация: 10.01.2011
Сообщений: 1,108
#1

Оптимизация кода - C++

20.06.2013, 00:14. Просмотров 551. Ответов 16
Метки нет (Все метки)

Здравствуйте! у меня есть такая функция, которая очень часто вызывается:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int fun(int x_,int y_,int z_)
{
for(int k=0;k<80;k++)
{
x = x_/64;
z = y_/64;
  if(x==m_Struct[k]->posX && z==m_Struct[k]->posZ)
  {
     for(int i=0;i<64;i++)
     {
       for(int j=0;j<64;j++)
       {
           if(m_Struct[k]->pos[(64*j)+i].x+30 > 0 && m_Struct[k]->pos[(64*j)+i].x+30 < 0 && m_Struct[k]->pos[(64*j)+i].z+30 > 0 && m_Struct[k]->pos[(64*j)+i].z+30 < 0)
{           
                         return m_Struct[k]->pos[(64*j)+i].y;
                }
       }
     }
  }
 
}
}
Можно ли это "чудо" оптимизировать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.06.2013, 00:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Оптимизация кода (C++):

оптимизация кода! - C++
Народ я тут написал простенькую программу которая вычесляет x из уровнения вида a+x=b x+a=b a+b=x Тоесть пишешь например:...

Оптимизация кода - C++
Программа ищет одинаковые файлы в папке где сама находится(по маске или расширению), по хэшу, и перемещает все копии в отдельную папку. ...

Оптимизация кода - C++
В С++ я совсем недавно, вот задали задачку: Перемножить 2 матрицы MxМ, элементами которых являются матрицы NxN. Код я вроде написал,...

Оптимизация кода - C++
Есть вот такой кусочек кода integer h (integer k,n) {return k–n*3 ;} . . . . . z = h (k1, n2) ; Подскажите - как его можно...

оптимизация кода - C++
Добрый вечер всем. У меня такая проблема: написал прогу, необходимо продемонстрировать ее работу. Т.е. есть L2 список, дек и массив деков,...

Оптимизация кода - C++
main: #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &quot;keyBuffer.h&quot; #include &quot;pause.h&quot; #include &lt;windows.h&gt; const char...

16
UnsKneD
алкокодер
154 / 150 / 11
Регистрация: 27.12.2012
Сообщений: 548
20.06.2013, 00:32 #2
Helldrg, что делает эта функция?
1
VTsaregorodtsev
371 / 354 / 52
Регистрация: 19.02.2010
Сообщений: 1,509
20.06.2013, 00:36 #3
Цитата Сообщение от Helldrg Посмотреть сообщение
Можно ли это "чудо" оптимизировать?
Конечно, можно. Всю подряд, начиная с 6-7 строк (вынести их за рамки внешнего цикла - а то вдруг компилятор такой дурной, что сам не выносит константы и инварианты)
1
Helldrg
26 / 55 / 1
Регистрация: 10.01.2011
Сообщений: 1,108
20.06.2013, 00:39  [ТС] #4
в функцию передаются 3 переменные, по двум переменным(обработанным) ищется стурктура которая нам нужна, когда мы ее находим мы ищем в ней запись по двум переменным(не обработанным) с помощи двух циклов, когда совпадение находится возвращаем интовое число из структуры которой мы искали, у которой первые две переменные равняются переданными переменными.
Тут для оптимизации впринципе не нужна int y_, а больше я ничего не вижу(

Добавлено через 1 минуту
VTsaregorodtsev
Воо, спасибо, это я пропустил
0
VTsaregorodtsev
371 / 354 / 52
Регистрация: 19.02.2010
Сообщений: 1,509
20.06.2013, 00:57 #5
Helldrg, да не, это вряд ли даст существенный эффект.
Я писал чисто ради хохмы. Реально надо глядеть всю программу - нельзя ли поменять представление данных, чтобы в этой функции получились более просто вычисляемые индексы массивов. Хотя... Умножение на 64 современные процессоры выполняют быстро (да и древним процессорам мог помогать компилятор, заменяя умножение на степень двойки командой сдвига на нужное число бит)
1
Helldrg
26 / 55 / 1
Регистрация: 10.01.2011
Сообщений: 1,108
20.06.2013, 01:04  [ТС] #6
Данные по другому не как не представить(
0
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
20.06.2013, 01:39 #7
Helldrg, попробуйте каждую переменную в циклах определить при помощи ключевого слова register - это просьба к компилятору занести объекты в регистр процессора. При "успешной" просьбе, значительно увеличивает скорость выполнения блока/программы (при условии, конечно, что обращение к объектам действительно происходит очень часто).

Добавлено через 9 минут
например в 4 строчке:
C++
1
 for(register int k=0;k<80;k++)
Добавлено через 35 секунд
а также в 10-й и 12-й
2
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
20.06.2013, 01:44 #8
Ключевые слова: векторизация, уменьшение количества ветвлений, разворачивание циклов, повышение локальности ссылок.

Рассовывание переменных по регистрам и умножение на 64 — это фигня. Компилятор с этим и так неплохо справляется.
1
UnsKneD
алкокодер
154 / 150 / 11
Регистрация: 27.12.2012
Сообщений: 548
20.06.2013, 01:49 #9
C++
1
m_Struct[k]->pos[(64*j)+i].x+30 > 0 && m_Struct[k]->pos[(64*j)+i].x+30 < 0
странное условие, не находите?
0
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
20.06.2013, 01:55 #10
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Рассовывание переменных по регистрам и умножение на 64 — это фигня.
Наблюдался случай, когда в одном единственном цикле (оптимизировать просто больше было нечего) при внесении в регистр двух переменных скорость выполнения модуля увеличилась чуть больше чем на 30%.
0
UnsKneD
алкокодер
154 / 150 / 11
Регистрация: 27.12.2012
Сообщений: 548
20.06.2013, 01:56 #11
Ещё inline функцию можно использовать.
0
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
20.06.2013, 02:02 #12
Цитата Сообщение от UnsKneD Посмотреть сообщение
Ещё inline функцию можно использовать.
Ну у него циклы, inline будет просто компилятором проигнорировано.

Добавлено через 5 минут
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Ключевые слова: векторизация, уменьшение количества ветвлений, разворачивание циклов, повышение локальности ссылок.
В этом вы на мой молодой и неопытный взгляд вы абсолютны правы. Да и вообще прибегание к inline, register и прочим хакам, должно быть в последнюю очередь.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7491 / 4606 / 692
Регистрация: 29.11.2010
Сообщений: 12,594
20.06.2013, 02:04 #13
Цитата Сообщение от xtorne21st Посмотреть сообщение
прочим хакам
это не хаки, это слезные молитвы о пощаде (если в последнюю очередь)
1
Helldrg
26 / 55 / 1
Регистрация: 10.01.2011
Сообщений: 1,108
20.06.2013, 02:22  [ТС] #14
Цитата Сообщение от UnsKneD Посмотреть сообщение
Код C++
1
m_Struct[k]->pos[(64*j)+i].x+30 > 0 && m_Struct[k]->pos[(64*j)+i].x+30 < 0
странное условие, не находите?
Там стоит так:
C++
1
m_Struct[k]->pos[(64*j)+i].x+30 > x_ && m_Struct[k]->pos[(64*j)+i].x+30 < x_
0
UnsKneD
алкокодер
154 / 150 / 11
Регистрация: 27.12.2012
Сообщений: 548
20.06.2013, 02:30 #15
C++
1
m_Struct[k]->pos[(64*j)+i].x+30 > x_ && m_Struct[k]->pos[(64*j)+i].x+30 < x_
Например, x_ = 10 ; pos[(64*j)+i].x+30 = 5;
Получается 5 > 10 && 5 < 10 - такое условие никогда не выполнится.
0
20.06.2013, 02:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2013, 02:30
Привет! Вот еще темы с ответами:

Оптимизация кода - C++
В общем дело такое, мне нужно 2 одинаковые программы(небольшие), только одна программа должна быть неоптимизированная, а другая, точно...

Оптимизация кода (C++) - C++
Добрый вечер. У меня есть две функции. Вопрос:&quot;Как оптимизировать этот код, пользуясь тем, что тела отличаются лишь несколькими строчками?&quot;...

Оптимизация кода - C++
Как сравнить 2 строки. Вот как их задавал в ходе программы string h,b; ... char * text = NULL; if ( OpenClipboard(0) ) { ...

Оптимизация кода - C++
Пожалуйста форумчане как можно сократить этот код Особенно от 27 до 90 строки #include &lt;iostream&gt; using namespace std; int main() ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru