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

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

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

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

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

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

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

оптимизация кода - C++
Задача: определить, является ли последовательность скобок действительной. Длинна строки не превышает 100000. Например: № Input Output ...

Оптимизация кода - 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...

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

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

Добавлено через 1 минуту
VTsaregorodtsev
Воо, спасибо, это я пропустил
VTsaregorodtsev
337 / 317 / 45
Регистрация: 19.02.2010
Сообщений: 1,354
20.06.2013, 00:57     Оптимизация кода #5
Helldrg, да не, это вряд ли даст существенный эффект.
Я писал чисто ради хохмы. Реально надо глядеть всю программу - нельзя ли поменять представление данных, чтобы в этой функции получились более просто вычисляемые индексы массивов. Хотя... Умножение на 64 современные процессоры выполняют быстро (да и древним процессорам мог помогать компилятор, заменяя умножение на степень двойки командой сдвига на нужное число бит)
Helldrg
-15 / 55 / 1
Регистрация: 10.01.2011
Сообщений: 1,100
20.06.2013, 01:04  [ТС]     Оптимизация кода #6
Данные по другому не как не представить(
xtorne21st
интересующийся
303 / 274 / 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
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
20.06.2013, 01:44     Оптимизация кода #8
Ключевые слова: векторизация, уменьшение количества ветвлений, разворачивание циклов, повышение локальности ссылок.

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

Добавлено через 5 минут
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Ключевые слова: векторизация, уменьшение количества ветвлений, разворачивание циклов, повышение локальности ссылок.
В этом вы на мой молодой и неопытный взгляд вы абсолютны правы. Да и вообще прибегание к inline, register и прочим хакам, должно быть в последнюю очередь.
MrGluck
Модератор
Эксперт CЭксперт С++
7162 / 4328 / 632
Регистрация: 29.11.2010
Сообщений: 11,750
20.06.2013, 02:04     Оптимизация кода #13
Цитата Сообщение от xtorne21st Посмотреть сообщение
прочим хакам
это не хаки, это слезные молитвы о пощаде (если в последнюю очередь)
Helldrg
-15 / 55 / 1
Регистрация: 10.01.2011
Сообщений: 1,100
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
алкокодер
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 - такое условие никогда не выполнится.
Helldrg
-15 / 55 / 1
Регистрация: 10.01.2011
Сообщений: 1,100
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++
Народ я тут написал простенькую программу которая вычесляет x из уровнения вида a+x=b x+a=b a+b=x Тоесть пишешь например:...

Оформление и оптимизация кода - C++
Собссно, сабж и есть, покритикуйте пожалуйста мой код, подскажите, что где неправильно...т.е нерационально, чем можно заменить, что лучше...

Оптимизация, редактирование кода - C++
Здраствуйте! Пишу крестики-нолики, но одно меня смущает, как это можно оптимизировать, поставить на цикл, а то ниче в голову не лезет. И...


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

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

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