Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Какая переменная быстрее? (http://forum.oszone.net/showthread.php?t=152357)

Ferum01 05-10-2009 11:04 1234775

Какая переменная быстрее?
 
У меня компилятор 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 1234915

Цитата:

Цитата 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])

Ferum01 05-10-2009 16:52 1235023

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

Drongo 05-10-2009 18:38 1235080

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

pva 05-10-2009 19:43 1235120

посчитай статистику функцией
Код:

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 1235268

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

makarovyi 07-10-2009 23:58 1237285

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

El Scorpio 08-10-2009 02:12 1237344

Цитата:

Цитата Ferum01
Как вы думаете переменная массива "ap1[i]" медленнее "p1" (обе типа int)? »

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

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

P.S.
Цитата:

Цитата Ferum01
В общем хотелось бы ясности в этом вопросе (эсперементировать не хотлось бы, код очень большой). »

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


Время: 09:06.

Время: 09:06.
© OSzone.net 2001-