|
Нужно оптимизировать код, Есть идеи как? |
|
|
|
Jan 20 2011, 14:56
|
Местный
  
Группа: Участник
Сообщений: 217
Регистрация: 11-06-10
Пользователь №: 57 868

|
Есть такой кусок кода: Код if((pwm>pgm_read_byte(&brightness[pwm_ch[0]]))|(pwm==0)){pd &= ~(1<<0);}//1 else {pd |= (1<<0);} if((pwm>pgm_read_byte(&brightness[pwm_ch[1]]))|(pwm==0)){pd &= ~(1<<1);}//2 else {pd |= (1<<1);} if((pwm>pgm_read_byte(&brightness[pwm_ch[2]]))|(pwm==0)){pa &= ~(1<<1);}//3 else {pa |= (1<<1);} if((pwm>pgm_read_byte(&brightness[pwm_ch[3]]))|(pwm==0)){pa &= ~(1<<0);}//4 else {pa |= (1<<0);} if((pwm>pgm_read_byte(&brightness[pwm_ch[4]]))|(pwm==0)){pd &= ~(1<<2);}//5 else {pd |= (1<<2);} if((pwm>pgm_read_byte(&brightness[pwm_ch[5]]))|(pwm==0)){pd &= ~(1<<3);}//6 else {pd |= (1<<3);} if((pwm>pgm_read_byte(&brightness[pwm_ch[6]]))|(pwm==0)){pd &= ~(1<<4);}//7 else {pd |= (1<<4);} if((pwm>pgm_read_byte(&brightness[pwm_ch[7]]))|(pwm==0)){pd &= ~(1<<5);}//8 else {pd |= (1<<5);} if((pwm>pgm_read_byte(&brightness[pwm_ch[8]]))|(pwm==0)){pb &= ~(1<<4);}//9 else {pb |= (1<<4);} if((pwm>pgm_read_byte(&brightness[pwm_ch[9]]))|(pwm==0)){pb &= ~(1<<3);}//10 else {pb |= (1<<3);} if((pwm>pgm_read_byte(&brightness[pwm_ch[10]]))|(pwm==0)){pb &= ~(1<<2);}//11 else {pb |= (1<<2);} if((pwm>pgm_read_byte(&brightness[pwm_ch[11]]))|(pwm==0)){pb &= ~(1<<1);}//12 else {pb |= (1<<1);} if((pwm>pgm_read_byte(&brightness[pwm_ch[12]]))|(pwm==0)){pb &= ~(1<<0);}//13 else {pb |= (1<<0);} if((pwm>pgm_read_byte(&brightness[pwm_ch[13]]))|(pwm==0)){pd &= ~(1<<6);}//14 else {pd |= (1<<6);} Он обрабатывается за 345 тактов. Мне нужно менее 300. Это возможно? А можно это как-то оформить ассемблерной вставкой? Спасибо.
|
|
|
|
|
 |
Ответов
|
Jan 25 2011, 10:11
|
Местный
  
Группа: Участник
Сообщений: 217
Регистрация: 11-06-10
Пользователь №: 57 868

|
Тут выяснилось, что еще вот эта конструкция кушает невообразимое число тактов. Код for(unsigned char i=0;i<14;i++) { if((a & (1<<i))&(b & (1<<i))) {pwm_ch[i]=255;}//1и1 if((a & (1<<i))&(!(b & (1<<i)))) {pwm_ch[i]=255;}//1и0 if((!(a & (1<<i)))&(b & (1<<i))) {pwm_ch[i]=0;}//0и1 if((!(a & (1<<i)))&(!(b & (1<<i)))) {pwm_ch[i]=0;}//0и0 } Даже если уменьшить разрядность ШИМ втрое... уже и не знаю как и быть.
|
|
|
|
|
Jan 25 2011, 12:16
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (skyled @ Jan 25 2011, 12:11)  Тут выяснилось, что еще вот эта конструкция кушает невообразимое число тактов. Мама! 1) Вы на каждой итерации делаете сдвиг единицы на i разрядов. Для процессора без аппаратного сдвигателя это очень накладная операция. 2) Вы используете двоичное "И" (&) вместо логического (&&). 3) заметьте, что у вас результат не зависит от значения b CODE uint8_t *ptr = &pwm_ch[13]; for(uint16_t mask = (1<<13); mask; mask >>= 1) { if(a & mask) *ptr-- = 255; else *ptr-- = 0; } P.S. Ой, xemul уже то же самое написал. Возможно, у него код даже лучше. P.P.S. ! и ~ у него не попутаны.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 26 2011, 14:06
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(Сергей Борщ @ Jan 25 2011, 15:16)  P.P.S. ! и ~ у него не попутаны. Замена ! на ~ без каких-либо ещё изменений даст лучший код на выходе. Замена посерёдке & на && добавит логичности сорцу и код тоже не ухудшит. А ненужный битово-логический замес, устроенный skyled'ом, не даёт ничего, кроме головняка оптимизатору.
|
|
|
|
Сообщений в этой теме
skyled Нужно оптимизировать код Jan 20 2011, 14:56 rezident Проверку pgm==0 из каждого условия уберите, сделав... Jan 20 2011, 15:07 codier Жуть
А побитное или ("|") в условиях в... Jan 20 2011, 15:14 skyled Спасибо за совет! Код действительно полегчал. ... Jan 20 2011, 15:21 codier А нельзя pgm_read_byte(&brightness[pwm_ch[1]])... Jan 20 2011, 15:26 skyled Цитата(codier @ Jan 20 2011, 18:26) А нел... Jan 20 2011, 15:47  follow_me избавьтесь от операций сдвига это забирает один ... Jan 20 2011, 18:03   777777 Цитата(follow_me @ Jan 20 2011, 21:03) из... Jan 20 2011, 18:08 follow_me pwm>pgm_read_byte(&brightness[pwm_ch[7]])
... Jan 20 2011, 18:40 smk Цитата(follow_me @ Jan 20 2011, 20:40) pw... Jan 20 2011, 19:09  follow_me Цитата(smk @ Jan 20 2011, 21:09) совершен... Jan 20 2011, 20:32   777777 Еще можно для оптимизации вытащить brightness из ф... Jan 21 2011, 07:18    demiurg_spb Цитата(777777 @ Jan 21 2011, 10:18) Еще м... Jan 21 2011, 14:01 codier 2follow_me:
2777777:
Глянул искомый девайс:
Цитат... Jan 21 2011, 07:38 _Pasha Все чаще и чаще наблюдаются жутковатые перлы. По ... Jan 21 2011, 08:54 follow_me В циклах кстати для приращения итератора стоит исп... Jan 21 2011, 15:34 _Pasha Цитата(demiurg_spb @ Jan 21 2011, 18:01) ... Jan 21 2011, 18:50 defunct Концептуально можно ускорить код - если вместо про... Jan 23 2011, 22:41 skyled Навскидку разумное зерно есть. Надо бдумать. А не ... Jan 24 2011, 14:55 defunct Цитата(skyled @ Jan 24 2011, 16:55) А не ... Jan 24 2011, 16:22  pokos Цитата(defunct @ Jan 24 2011, 19:22) Долж... Jan 24 2011, 17:37 pokos У меня на 3 канала было вот так сделано:
Код// Tim... Jan 24 2011, 15:05 kolobok0 Цитата(pokos @ Jan 24 2011, 18:05) Код...... Jan 25 2011, 10:15  pokos Цитата(kolobok0 @ Jan 25 2011, 13:15) А т... Jan 25 2011, 11:39 _Bill Цитата(pokos @ Jan 24 2011, 19:05) У меня... Jan 25 2011, 10:46 xemul Цитата(skyled @ Jan 25 2011, 13:11) Тут в... Jan 25 2011, 11:52   Сергей Борщ QUOTE (xemul @ Jan 26 2011, 16:06) Замена... Jan 26 2011, 18:39 pokos Чото не могу найти в закромах финальные исходники ... Jan 25 2011, 20:30 _Pasha Цитата(kolobok0 @ Jan 25 2011, 13:15) хот... Jan 25 2011, 21:07 kolobok0 Цитата(_Pasha @ Jan 26 2011, 00:07) ...Во... Jan 25 2011, 22:00  _Pasha Цитата(kolobok0 @ Jan 26 2011, 01:00) или... Jan 27 2011, 04:15   defunct Цитата(_Pasha @ Jan 27 2011, 06:15) Ну п... Feb 1 2011, 12:51    _Pasha Цитата(defunct @ Feb 1 2011, 15:51) Ни од... Feb 1 2011, 16:37     defunct Цитата(_Pasha @ Feb 1 2011, 18:37) А по В... Feb 2 2011, 02:24
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|