Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Какая переменная быстрее?

Ответить
Настройки темы
C/C++ - Какая переменная быстрее?

Ветеран


Сообщения: 514
Благодарности: 18

Профиль | Отправить PM | Цитировать


Изменения
Автор: Drongo
Дата: 05-10-2009
Описание: Тег [code]...[/code] - #
У меня компилятор Borland Builder 5.0.
При расчетах думаю как повысить производительность кода, в связи с чем и возник вопрос.
В программном коде много условий приведенных ниже. Как вы думаете переменная массива "ap1[i]" медленнее "p1" (обе типа int)?
Если переменная массива медленнее, то разумнее ли в начале цикла можно переменную цикла присвоить обычной переменной и уже сней работать?
Хотя есть предположение, что сам компилятор все делает как нужно и ничего менять не нужно...
В общем хотелось бы ясности в этом вопросе (эсперементировать не хотлось бы, код очень большой).

Код: Выделить весь код
(p1==ap1[i] && p6==ap6[i])
 && (( p2==ap2[i] && p3==ap3[i] && p4==ap4[i] && p5==ap5[i])
||   ( p2==ap3[i] && p3==ap4[i] && p4==ap5[i] && p5==ap2[i])

Отправлено: 11:04, 05-10-2009

 

Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Цитата Ferum01:
Как вы думаете переменная массива "ap1[i]" медленнее "p1" (обе типа int)? »
Я думаю нет, они равны, т.к. идёт сразу обращение по ардесу с нужным индексом, а вот такой ход
Цитата Ferum01:
Если переменная массива медленнее, то разумнее ли в начале цикла можно переменную цикла присвоить обычной переменной и уже сней работать? »
Действительно может замедлить программу, т.к. придётся тратить время на присваивание и переприсваивание.

Должно несколько ускорить сравнение использование скобок () для всех сравнений с условием && и ||

Поставить по две скобки до оператора или - || и после него по две. Объединив условия и - && в группы.
Код: Выделить весь код
(p1==ap1[i] && p6==ap6[i] && p2==ap2[i] && p3==ap3[i] && p4==ap4[i] && p5==ap5[i]) || (p2==ap3[i] && p3==ap4[i] && p4==ap5[i] && p5==ap2[i])

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Последний раз редактировалось Drongo, 05-10-2009 в 15:03. Причина: Убрал лишние скобки

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:51, 05-10-2009 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 514
Благодарности: 18

Профиль | Отправить PM | Цитировать


Условие не удасться ускорить, так я привел только первые три строчки, а на самом деле таких 660 (в одном if), причем они логически связаны между собой.

Отправлено: 16:52, 05-10-2009 | #3


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Ferum01, Так а что, если проанализировать, наиболее редкое сравнение значений, которое истинно и поставить его в начале каждого условия, потому что при условии и - && сравнение идёт до первого истинного, а к примеру, 9 сравнений - истино, а 10 - ложно, то лучше поставить наоборот. А для операции или - || лучше поставить первым то сравнение, которое встречается наиболее чаще.

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 18:38, 05-10-2009 | #4

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить 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
Благодарности: 63

Профиль | Отправить PM | Цитировать


Ferum01, возможно вам следует вынести наиболее тяжелые вычисления в отдельную dll
и собирать ее другим, более новым и лучшим компилятором (Intel, Ms VS). Или же, как минимум, поиграйтесь с уровнями оптимизации компилятора Buildera

-------
black-eric.livejournal.com


Отправлено: 22:02, 05-10-2009 | #6


Новый участник


Сообщения: 1
Благодарности: 1

Профиль | Отправить PM | Цитировать


если посмотреть дизасмом, то обе переменные стековые указатели. А после оптимизации они становятся регистровыми с обрашением в раздел .data. Советую не пытаться ререхитрить компилятор, а посмотреть лит-ру по быстрой сортировке '
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:58, 07-10-2009 | #7


ИО Капитана Очевидности


Contributor


Сообщения: 5387
Благодарности: 1105

Профиль | Отправить PM | Цитировать


Цитата Ferum01:
Как вы думаете переменная массива "ap1[i]" медленнее "p1" (обе типа int)? »
Можно посмотреть встроенным в Builder дизассемблером, сколько команд процессора займёт чтение/запись обоих переменных.
p1 - стековая переменная с фиксированным смещением - читается одной командой
ap1 [i] - стековая переменная со смещением, определяемым суммой начала массива (ap1) и значения индекса (i * 4). Однако процессор вполне в состоянии прочитать и это одной командой.

Причём, в "релизном" режиме со включенной оптимизацией компилятор сам определит оптимальную последовательность команд.

P.S.
Цитата Ferum01:
В общем хотелось бы ясности в этом вопросе (эсперементировать не хотлось бы, код очень большой). »
На будущее...
Судя по всему, эти шесть значений описывают какой-то объект, а шесть массивов - массив объектов.
В таких случаях проще объединить их в "структуру", и в этой структуре определить оператор "==" - функцию, которая будет выполнять рассматриваемое условие проверки.

-------
Самое совершенное оружие, которым забиты арсеналы богатых и процветающих наций, может легко уничтожить необразованного, больного, бедного и голодного. Но оно не может уничтожить невежество, болезнь, нищету и голод. (Фидель Кастро)

Почему всех осужденных за измену Родине при Сталине реабилитировали при Горбачёве по отсутствию состава преступления? Потому что при Горбачёве измену Родине перестали считать преступлением.

Это сообщение посчитали полезным следующие участники:

Отправлено: 02:12, 08-10-2009 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Какая переменная быстрее?

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход