Показать полную графическую версию : Какая переменная быстрее?
У меня компилятор 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])
Как вы думаете переменная массива "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])
Условие не удасться ускорить, так я привел только первые три строчки, а на самом деле таких 660 (в одном if), причем они логически связаны между собой.
Ferum01, Так а что, если проанализировать, наиболее редкое сравнение значений, которое истинно и поставить его в начале каждого условия, потому что при условии и - && сравнение идёт до первого истинного, а к примеру, 9 сравнений - истино, а 10 - ложно, то лучше поставить наоборот. А для операции или - || лучше поставить первым то сравнение, которое встречается наиболее чаще.
посчитай статистику функцией
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.