Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Helldrg
54 / 54 / 1
Регистрация: 10.01.2011
Сообщений: 1,080
20.06.2013, 00:14     Оптимизация кода #1
Здравствуйте! у меня есть такая функция, которая очень часто вызывается:
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;
                }
       }
     }
  }
 
}
}
Можно ли это "чудо" оптимизировать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.06.2013, 00:14     Оптимизация кода
Посмотрите здесь:

Оптимизация кода C++
C++ Оптимизация кода
оптимизация кода! C++
Оптимизация кода C++
Оптимизация кода C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
UnsKneD
алкокодер
 Аватар для UnsKneD
153 / 149 / 11
Регистрация: 27.12.2012
Сообщений: 548
20.06.2013, 00:32     Оптимизация кода #2
Helldrg, что делает эта функция?
VTsaregorodtsev
297 / 277 / 35
Регистрация: 19.02.2010
Сообщений: 1,211
20.06.2013, 00:36     Оптимизация кода #3
Цитата Сообщение от Helldrg Посмотреть сообщение
Можно ли это "чудо" оптимизировать?
Конечно, можно. Всю подряд, начиная с 6-7 строк (вынести их за рамки внешнего цикла - а то вдруг компилятор такой дурной, что сам не выносит константы и инварианты)
Helldrg
54 / 54 / 1
Регистрация: 10.01.2011
Сообщений: 1,080
20.06.2013, 00:39  [ТС]     Оптимизация кода #4
в функцию передаются 3 переменные, по двум переменным(обработанным) ищется стурктура которая нам нужна, когда мы ее находим мы ищем в ней запись по двум переменным(не обработанным) с помощи двух циклов, когда совпадение находится возвращаем интовое число из структуры которой мы искали, у которой первые две переменные равняются переданными переменными.
Тут для оптимизации впринципе не нужна int y_, а больше я ничего не вижу(

Добавлено через 1 минуту
VTsaregorodtsev
Воо, спасибо, это я пропустил
VTsaregorodtsev
297 / 277 / 35
Регистрация: 19.02.2010
Сообщений: 1,211
20.06.2013, 00:57     Оптимизация кода #5
Helldrg, да не, это вряд ли даст существенный эффект.
Я писал чисто ради хохмы. Реально надо глядеть всю программу - нельзя ли поменять представление данных, чтобы в этой функции получились более просто вычисляемые индексы массивов. Хотя... Умножение на 64 современные процессоры выполняют быстро (да и древним процессорам мог помогать компилятор, заменяя умножение на степень двойки командой сдвига на нужное число бит)
Helldrg
54 / 54 / 1
Регистрация: 10.01.2011
Сообщений: 1,080
20.06.2013, 01:04  [ТС]     Оптимизация кода #6
Данные по другому не как не представить(
xtorne21st
интересующийся
300 / 271 / 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-й
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
20.06.2013, 01:44     Оптимизация кода #8
Ключевые слова: векторизация, уменьшение количества ветвлений, разворачивание циклов, повышение локальности ссылок.

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

Добавлено через 5 минут
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Ключевые слова: векторизация, уменьшение количества ветвлений, разворачивание циклов, повышение локальности ссылок.
В этом вы на мой молодой и неопытный взгляд вы абсолютны правы. Да и вообще прибегание к inline, register и прочим хакам, должно быть в последнюю очередь.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4925 / 2668 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
20.06.2013, 02:04     Оптимизация кода #13
Цитата Сообщение от xtorne21st Посмотреть сообщение
прочим хакам
это не хаки, это слезные молитвы о пощаде (если в последнюю очередь)
Helldrg
54 / 54 / 1
Регистрация: 10.01.2011
Сообщений: 1,080
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_
UnsKneD
алкокодер
 Аватар для UnsKneD
153 / 149 / 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 - такое условие никогда не выполнится.
Helldrg
54 / 54 / 1
Регистрация: 10.01.2011
Сообщений: 1,080
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 секунд
Суть не в этом, суть в том, как бы поменьше проходов сделать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2013, 04:25     Оптимизация кода
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
UnsKneD
алкокодер
 Аватар для UnsKneD
153 / 149 / 11
Регистрация: 27.12.2012
Сообщений: 548
20.06.2013, 04:25     Оптимизация кода #17
Цитата Сообщение от Helldrg Посмотреть сообщение
Суть не в этом, суть в том, как бы поменьше проходов сделать
ну так относительно этого условия и смотреть проходы.
Yandex
Объявления
20.06.2013, 04:25     Оптимизация кода
Ответ Создать тему
Опции темы

Текущее время: 00:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru