|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Какая переменная быстрее? |
|
C/C++ - Какая переменная быстрее?
|
Ветеран Сообщения: 514 |
Профиль | Отправить PM | Цитировать
У меня компилятор Borland Builder 5.0.
При расчетах думаю как повысить производительность кода, в связи с чем и возник вопрос. В программном коде много условий приведенных ниже. Как вы думаете переменная массива "ap1[i]" медленнее "p1" (обе типа int)? Если переменная массива медленнее, то разумнее ли в начале цикла можно переменную цикла присвоить обычной переменной и уже сней работать? Хотя есть предположение, что сам компилятор все делает как нужно и ничего менять не нужно... В общем хотелось бы ясности в этом вопросе (эсперементировать не хотлось бы, код очень большой). |
|
Отправлено: 11:04, 05-10-2009 |
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать Цитата Ferum01:
Цитата Ferum01:
Должно несколько ускорить сравнение использование скобок () для всех сравнений с условием && и || Поставить по две скобки до оператора или - || и после него по две. Объединив условия и - && в группы. |
||
------- Последний раз редактировалось Drongo, 05-10-2009 в 15:03. Причина: Убрал лишние скобки Отправлено: 13:51, 05-10-2009 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 514
|
Профиль | Отправить PM | Цитировать Условие не удасться ускорить, так я привел только первые три строчки, а на самом деле таких 660 (в одном if), причем они логически связаны между собой.
|
Отправлено: 16:52, 05-10-2009 | #3 |
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать Ferum01, Так а что, если проанализировать, наиболее редкое сравнение значений, которое истинно и поставить его в начале каждого условия, потому что при условии и - && сравнение идёт до первого истинного, а к примеру, 9 сравнений - истино, а 10 - ложно, то лучше поставить наоборот. А для операции или - || лучше поставить первым то сравнение, которое встречается наиболее чаще.
|
------- Отправлено: 18:38, 05-10-2009 | #4 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать посчитай статистику функцией
map<string,pair<int,unsigned> > __calc_stats; bool _stats(const char* expr, bool result) { static const int step_by_result[2] = {-1,1}; pair<int,unsigned>& stat(__calc_stats[expr]); stat.first += step_by_result[result]; // баланс да/нет ++stat.second; // сколько раз посчиталось return result; } _stat("p1==ap1[i] && p6==ap6[i]", p1==ap1[i] && p6==ap6[i]) && ... чтобы переупорядочить их. |
|
Отправлено: 19:43, 05-10-2009 | #5 |
Старожил Сообщения: 435
|
Профиль | Отправить PM | Цитировать Ferum01, возможно вам следует вынести наиболее тяжелые вычисления в отдельную dll
и собирать ее другим, более новым и лучшим компилятором (Intel, Ms VS). Или же, как минимум, поиграйтесь с уровнями оптимизации компилятора Buildera |
------- Отправлено: 22:02, 05-10-2009 | #6 |
Новый участник Сообщения: 1
|
Профиль | Отправить PM | Цитировать если посмотреть дизасмом, то обе переменные стековые указатели. А после оптимизации они становятся регистровыми с обрашением в раздел .data. Советую не пытаться ререхитрить компилятор, а посмотреть лит-ру по быстрой сортировке '
|
Отправлено: 23:58, 07-10-2009 | #7 |
ИО Капитана Очевидности Сообщения: 5387
|
Профиль | Отправить PM | Цитировать Цитата Ferum01:
p1 - стековая переменная с фиксированным смещением - читается одной командой ap1 [i] - стековая переменная со смещением, определяемым суммой начала массива (ap1) и значения индекса (i * 4). Однако процессор вполне в состоянии прочитать и это одной командой. Причём, в "релизном" режиме со включенной оптимизацией компилятор сам определит оптимальную последовательность команд. P.S. Цитата Ferum01:
Судя по всему, эти шесть значений описывают какой-то объект, а шесть массивов - массив объектов. В таких случаях проще объединить их в "структуру", и в этой структуре определить оператор "==" - функцию, которая будет выполнять рассматриваемое условие проверки. |
||
------- Отправлено: 02:12, 08-10-2009 | #8 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Переменная Дня недели | ratibor79 | Скриптовые языки администрирования Windows | 22 | 28-01-2011 21:03 | |
Переменная Null в AutoIt | abb269 | AutoIt | 13 | 28-08-2009 10:49 | |
Глобальная переменная | 11943499 | AutoIt | 9 | 23-07-2009 20:58 | |
Переменная kern.maxproc | xliver | Общий по FreeBSD | 2 | 02-03-2007 22:38 | |
Сколько действует переменная в сессии | vagner_HATE | Вебмастеру | 17 | 13-09-2005 15:17 |
|