Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
1

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте! у меня есть такая функция, которая очень часто вызывается:
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.06.2013, 00:14
Ответы с готовыми решениями:

оптимизация кода
Задача: определить, является ли последовательность скобок действительной. Длинна строки не...

Оптимизация кода
Как можно оптимизировать данный программный код? Ответ объяснить void func() { for (int i...

Оптимизация кода
Пожалуйста форумчане как можно сократить этот код Особенно от 27 до 90 строки #include &lt;iostream&gt;...

Оптимизация кода
Помогите оптимизировать код. суть программы такая, принимает на вход колличество бегунов и в...

16
алкокодер
157 / 153 / 41
Регистрация: 27.12.2012
Сообщений: 550
20.06.2013, 00:32 2
Helldrg, что делает эта функция?
1
1487 / 1414 / 240
Регистрация: 19.02.2010
Сообщений: 3,916
20.06.2013, 00:36 3
Цитата Сообщение от Helldrg Посмотреть сообщение
Можно ли это "чудо" оптимизировать?
Конечно, можно. Всю подряд, начиная с 6-7 строк (вынести их за рамки внешнего цикла - а то вдруг компилятор такой дурной, что сам не выносит константы и инварианты)
1
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
20.06.2013, 00:39  [ТС] 4
в функцию передаются 3 переменные, по двум переменным(обработанным) ищется стурктура которая нам нужна, когда мы ее находим мы ищем в ней запись по двум переменным(не обработанным) с помощи двух циклов, когда совпадение находится возвращаем интовое число из структуры которой мы искали, у которой первые две переменные равняются переданными переменными.
Тут для оптимизации впринципе не нужна int y_, а больше я ничего не вижу(

Добавлено через 1 минуту
VTsaregorodtsev
Воо, спасибо, это я пропустил
0
1487 / 1414 / 240
Регистрация: 19.02.2010
Сообщений: 3,916
20.06.2013, 00:57 5
Helldrg, да не, это вряд ли даст существенный эффект.
Я писал чисто ради хохмы. Реально надо глядеть всю программу - нельзя ли поменять представление данных, чтобы в этой функции получились более просто вычисляемые индексы массивов. Хотя... Умножение на 64 современные процессоры выполняют быстро (да и древним процессорам мог помогать компилятор, заменяя умножение на степень двойки командой сдвига на нужное число бит)
1
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
20.06.2013, 01:04  [ТС] 6
Данные по другому не как не представить(
0
интересующийся
311 / 282 / 93
Регистрация: 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
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
20.06.2013, 01:44 8
Ключевые слова: векторизация, уменьшение количества ветвлений, разворачивание циклов, повышение локальности ссылок.

Рассовывание переменных по регистрам и умножение на 64 — это фигня. Компилятор с этим и так неплохо справляется.
1
алкокодер
157 / 153 / 41
Регистрация: 27.12.2012
Сообщений: 550
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
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
20.06.2013, 01:55 10
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Рассовывание переменных по регистрам и умножение на 64 — это фигня.
Наблюдался случай, когда в одном единственном цикле (оптимизировать просто больше было нечего) при внесении в регистр двух переменных скорость выполнения модуля увеличилась чуть больше чем на 30%.
0
алкокодер
157 / 153 / 41
Регистрация: 27.12.2012
Сообщений: 550
20.06.2013, 01:56 11
Ещё inline функцию можно использовать.
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
20.06.2013, 02:02 12
Цитата Сообщение от UnsKneD Посмотреть сообщение
Ещё inline функцию можно использовать.
Ну у него циклы, inline будет просто компилятором проигнорировано.

Добавлено через 5 минут
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Ключевые слова: векторизация, уменьшение количества ветвлений, разворачивание циклов, повышение локальности ссылок.
В этом вы на мой молодой и неопытный взгляд вы абсолютны правы. Да и вообще прибегание к inline, register и прочим хакам, должно быть в последнюю очередь.
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
20.06.2013, 02:04 13
Цитата Сообщение от xtorne21st Посмотреть сообщение
прочим хакам
это не хаки, это слезные молитвы о пощаде (если в последнюю очередь)
1
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
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
алкокодер
157 / 153 / 41
Регистрация: 27.12.2012
Сообщений: 550
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
29 / 58 / 6
Регистрация: 10.01.2011
Сообщений: 1,231
20.06.2013, 02:33  [ТС] 16
Цитата Сообщение от UnsKneD Посмотреть сообщение
Код 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 - такое условие никогда не выполнится.
Ну значит там:
C++
1
m_Struct[k]->pos[(64*j)+i].x+30 >= x_ && m_Struct[k]->pos[(64*j)+i].x <= x_
Добавлено через 39 секунд
Суть не в этом, суть в том, как бы поменьше проходов сделать
0
алкокодер
157 / 153 / 41
Регистрация: 27.12.2012
Сообщений: 550
20.06.2013, 04:25 17
Цитата Сообщение от Helldrg Посмотреть сообщение
Суть не в этом, суть в том, как бы поменьше проходов сделать
ну так относительно этого условия и смотреть проходы.
0
20.06.2013, 04:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.06.2013, 04:25
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru