Войти

Показать полную графическую версию : Какая переменная быстрее?


Ferum01
05-10-2009, 11:04
У меня компилятор 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])

Drongo
05-10-2009, 13:51
Как вы думаете переменная массива "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])

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

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

pva
05-10-2009, 19:43
посчитай статистику функцией

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]) && ...

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

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

makarovyi
07-10-2009, 23:58
если посмотреть дизасмом, то обе переменные стековые указатели. А после оптимизации они становятся регистровыми с обрашением в раздел .data. Советую не пытаться ререхитрить компилятор, а посмотреть лит-ру по быстрой сортировке :)'

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

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

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




© OSzone.net 2001-2012