Отговори на тема  [ 17 мнения ]  Отиди на страница 1, 2  Следваща
Оптимизация на една функция 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение Оптимизация на една функция
Пиша една програмка за PIC16F627A. Ама май идват прекалено много задачи за такъв дребен процесор. И бързодеиствието почти не стига и флаша също. А си купих вече процесорите и не върви да купвам 50 броя други процесори. Така че оптимизирам. С флаша почти успях но еи с тая функция тук която изписва в десетичен вид int na LCD дисплея не успях да се преборя,ако стане с десетина двадесет цикъла по малко времето за изпълнение ще тръгне всичко както изглежда.

void lcd_PrintNumber(unsigned int number)
{
char tmp;
unsigned int delitel = 10000;
static bit start;

start = 0;
st:
tmp = number / delitel;
number = number % delitel;
if (tmp || start )
{
lcd_putch(tmp + 48) ;
start = 1;
}
delitel = delitel / 10;
if ( delitel ) goto st;
}

Някои да има идея за някаква оптимизация ? lcd_putch(char inp) е оптимизирана до максимум и времената за работа с дисплея са сведени до възможния минимум с конкретния дисплеи.
бит start служи за елиминиране на излишните нули пред изписваното число.


Пон Мар 07, 2005 3:30 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Това съм го писал нейде на АСМ, обаче е в нас...за колко разряда ти трябва?


Пон Мар 07, 2005 3:56 pm
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Вто Ное 16, 2004 4:43 pm
Мнения: 85
Местоположение: София
Мнение 
Не съм сигурен, но мисля, че това ще намали броя процесорни цикли за сметка на по-дълга функция. Просто се пропуска цикъла и излишните деления на delitel. Освен това мисля, че твоята функция при подаване на number = 0 няма да изведе нищо.
Код:
void lcd_PrintNumber (unsigned int number) {
char tmp;
char start;

   tmp = number / 10000;
   number %= 10000;
   start = tmp;
   if (start) {
      lcd_putch (tmp + 48);
   }

   tmp = number / 1000;
   number %= 1000;
   start += tmp;
   if (start) {
      lcd_putch (tmp + 48);
   }

   tmp = number / 100;
   number %= 100;
   start += tmp;
   if (start) {
      lcd_putch (tmp + 48);
   }

   tmp = number / 10;
   number %= 10;
   start += tmp;
   if (start) {
      lcd_putch (tmp + 48);
   }

   lcd_putch (number + 48);
}


Пон Мар 07, 2005 4:02 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Последно ми трябват 25 или 26 цикъла по малко. Сметнах го от симулацията в протеус.

Predator_MF и аз прегледах асм кода дето го дава компилатора но ако се спазва алгоритъма на C кода могат да се спестят по мое виждане 4 баита
което така като гледам са или 6 или 9 цикъла по малко. Явно трябва оптимизация в алгоритъма. А става дума за unsigned int - 16бит което ще рече 5 разряда.

danov Така обаче не ми стига мястото в флаша. А е възможно и да стане, деленето гълта доста ресурси. Ако няма други идеи ще пробвам да изнамеря откъде да спестя още някои баит. А показването на нула съм го ракарал съзнателно за оптимизация. Просто показанията в случая са винаги над 200.

А няма ли някакъв опростен алгоритъм за делене на десет? Аз лично не успях да измисля но това не означава че няма.


Пон Мар 07, 2005 8:49 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Ами утре ще си ти дам кода си...нямам нет в нас :x
А на въпроса ти за делене на 10, мисля че имаше някаква "бърза" функция в CCS-а, така и не и обърнах внимание...и нея ще огледам.


Пон Мар 07, 2005 8:53 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
Колко цикъла е в момента? Мога да се опитам да направя нещо по-така, ама ми трябва база за сравнение.


Пон Мар 07, 2005 8:54 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Бях го сметнал от симулацията но къде го записах ..........
Ако някой не изнамери някаква бърза функция за делене на 10 ще го сметна пак.
То маи само в това делене има някакъв хляб за оптимизация


Вто Мар 08, 2005 3:03 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
Разгледай ф-ята itoa(), или даже я използвай направо.


Вто Мар 08, 2005 10:20 am
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Вто Ное 16, 2004 4:43 pm
Мнения: 85
Местоположение: София
Мнение 
Може да пробваш и това:
Код:
void lcd_PrintNumber (unsigned int number) {
char a [5];
char i, tmp, start;

   i = 0;
   start = 0;
   while (number) {
      tmp = number % 10;
      number /= 10;
      start += tmp;
      if (start) a [i++] = tmp + 48;
   }
   i --;
   while (i >= 0) {
      lcd_putch (a [i--]);
   }
}


Вто Мар 08, 2005 12:49 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Във itoa() и atoi() на CCS-а забелязах, че трябва да напишеш каква ти е основата на числото - 10 или 16 (десетично или шеснайсетично). По default е 10-ично. Според мен са доста бавни.
Аз за по-бърз начин за делене на 10 не се сетих...В момента се сещам само за два начина:
1. Вадиш 10 от числото, докато получиш число по-малко от 10.
2. Ако разделиш числото на две, след това повтаряш (1.), само че вадиш по 5, няма ли да имаш почти наполовина цикли :!: :?: :idea:


Вто Мар 08, 2005 3:44 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Данов това стана супер,идеята ти да се започне обратно работи. ето това е оптимизирания вариант. И нула също изписва.

Код:
void lcd_PrintNumber (unsigned int number)
{
   char i,tmp;
   char a [5];

   i = 0;
wl:
    tmp    = number % 10;
    number    = number / 10;
    a[i++]    = tmp + 48;
   if (number) goto wl;
      
wlA:
   i --;
   lcd_putch (a[i]);
   if(i) goto wlA;
}


goto съм използвал защото под Hi-Tech така винаги дава най оптималния код. Пък сигурно важи и за други компилатори като не им оставиш място за фантазии.

Реконструктор. деиствително готовите функции се оказаха бавни.

Predator_MF това с изваждането би било много бавно при голямо число. Явно няма начин за бързо делене на 10.

Пък на мен ще ми е за урок да не бързам да купувам преди да съм готов с софта :)


Вто Мар 08, 2005 4:17 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
това не е ли по-бързо:
tmp1 = number;
number = tmp1 / 10;
tmp = tmp1 - number * 10;

имаш умножение вместо деление ( остатък ) ?


Вто Мар 08, 2005 4:36 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
долу горе същото бързодеистеие но с 9 баита по дълга и 2 баита рам повече


Вто Мар 08, 2005 5:10 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
жалко. На PIC18 вероятно не би било така, но тук явно не се почели.


Вто Мар 08, 2005 5:20 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Вто Ное 16, 2004 4:43 pm
Мнения: 85
Местоположение: София
Мнение 
Nikola Kirov написа:
Пък на мен ще ми е за урок да не бързам да купувам преди да съм готов с софта :)


Недей така, нека има хляб и за програмистите :D


Вто Мар 08, 2005 5:28 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 17 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни