Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 13.08.2012, 10:57  
svad0
Прописка
 
Регистрация: 14.11.2007
Сообщений: 150
Сказал спасибо: 3
Сказали Спасибо 47 раз(а) в 43 сообщении(ях)
svad0 на пути к лучшему
По умолчанию Какой код быстрее(Си)?

Приветствую!

Есть три реализации обнуления счетчика при достижении максимального значения:

Вариант 1:
Код:
(count›=MAX) ? (count=0) : (count++);
Вариант 2:
Код:
count = (count+1) % MAX;
Вариант 3:
Код:
if (++count›=MAX) count = 0;
Какой из них оптимальней по быстродействию?
Реклама:
svad0 вне форума  
Сказали "Спасибо" svad0
warel (29.06.2019)
Непрочитано 13.08.2012, 11:01  
aleksandr_zh
Гражданин KAZUS.RU
 
Регистрация: 17.11.2011
Адрес: Брянская область, РФ
Сообщений: 699
Сказал спасибо: 693
Сказали Спасибо 428 раз(а) в 213 сообщении(ях)
aleksandr_zh на пути к лучшему
По умолчанию Re: Какой код быстрее(Си)?

открыть ассм и посмотреть
aleksandr_zh вне форума  
Сказали "Спасибо" aleksandr_zh
warel (29.06.2019)
Непрочитано 13.08.2012, 11:29  
niXto
Почётный гражданин KAZUS.RU
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: Какой код быстрее(Си)?

...потом выкинуть из сгенерированного асма десяток ненужных команд, и оформить ассемблерной вставкой
niXto вне форума  
Эти 2 пользователя(ей) сказали Спасибо niXto за это сообщение:
aleksandr_zh (13.08.2012), warel (29.06.2019)
Непрочитано 13.08.2012, 11:37  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: Какой код быстрее(Си)?

svad0, Еще есть частный случай, если максимальное значение счетчика степень двойки .
Код:
 (count++) & (MAX-1)
где MAX степень двойки , а count - байт .
При компиляции- две инструкции на асме .
__________________
Осторожно , злой кот

Последний раз редактировалось dosikus; 13.08.2012 в 12:03.
dosikus вне форума  
Эти 2 пользователя(ей) сказали Спасибо dosikus за это сообщение:
Dmitri_256 (16.08.2012), warel (29.06.2019)
Непрочитано 13.08.2012, 12:21  
svad0
Прописка
 
Регистрация: 14.11.2007
Сообщений: 150
Сказал спасибо: 3
Сказали Спасибо 47 раз(а) в 43 сообщении(ях)
svad0 на пути к лучшему
По умолчанию Re: Какой код быстрее(Си)?

dosikus, не совсем понятно как будет обнуляться сам счетчик.
Наверное имелось ввиду что-то типа этого:
Код:
count = (count++) & (MAX-1);
Интересный вариант, спасибо.
svad0 вне форума  
Сказали "Спасибо" svad0
warel (29.06.2019)
Непрочитано 13.08.2012, 13:14  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: Какой код быстрее(Си)?

Сообщение от svad0 Посмотреть сообщение
dosikus, не совсем понятно как будет обнуляться сам счетчик.
Наверное имелось ввиду что-то типа этого:
Код:
count = (count++) & (MAX-1);
Скорей так .
Код:
    Counter++;                            
    Counter&=0x03;
Уже конкретный счетчик до 4х...
__________________
Осторожно , злой кот

Последний раз редактировалось dosikus; 13.08.2012 в 13:16.
dosikus вне форума  
Сказали "Спасибо" dosikus
warel (29.06.2019)
Непрочитано 13.08.2012, 13:27  
mimuh64
Прописка
 
Регистрация: 29.10.2008
Сообщений: 272
Сказал спасибо: 0
Сказали Спасибо 102 раз(а) в 95 сообщении(ях)
mimuh64 на пути к лучшему
По умолчанию Re: Какой код быстрее(Си)?

Просчет таких вопросов правильно делать через Ассм (по количеству команд), но такой подход часто вызывает трудности (у Сишников). Я делаю такие сравнения в Протеусе. Технология очень простая. Точность (я просчитывал и сравнивал по командам) полностью совпадает с циклами (длительностями команд).
Вот так выглядит приоритет в твоих желания:
1. count=(++count)&MAX; // MAX кратно степени двойки минус 1, например 63.
2. if (++count›=MAX) count = 0;
3. (count›=MAX) ? (count=0) : (count++);
4. count = (count+1) % MAX; //самый длинный, потому что процедура деления

Сделай прмерчики, поставь маркеры - выдача единицы и выдача нуля, и сравни (хотябы по осцилографу), для полной точности нужно смотреть на Цифровом анализаторе (речь идет о протеусе).
Например:
porta = 1;
count=(++count)&MAX;
porta = 0;

Здесь можно почитать как применять Протеус для измерения. На Казусе Протеус шикарно представлен.

Последний раз редактировалось mimuh64; 13.08.2012 в 13:59.
mimuh64 вне форума  
Сказали "Спасибо" mimuh64
warel (29.06.2019)
Непрочитано 13.08.2012, 19:42  
dash
Частый гость
 
Регистрация: 19.08.2004
Сообщений: 33
Сказал спасибо: 6
Сказали Спасибо 11 раз(а) в 9 сообщении(ях)
dash на пути к лучшему
По умолчанию Re: Какой код быстрее(Си)?

ну начнем с того, что первый вариант НЕ эквивалентен второму и третьему, поскольку в нем count достигает MAX
можно преподложить, что второй вариант будет медленнее изза операции деления.
а теперь смотрим
Код:
(count›=MAX) ? (count=0) : (count++);

0x08000254 2832      CMP      r0,#0x32
0x08000256 BFAC      ITE      GE
0x08000258 2100      MOVGE    r1,#0x00
0x0800025A 1C41      ADDLT    r1,r0,#1
Код:
count = (count+1) % MAX;

0x08000252 4913      LDR      r1,[pc,#76]  ; @0x080002A0
0x08000254 1C40      ADDS     r0,r0,#1
0x08000256 FB812100  SMULL    r2,r1,r1,r0
0x0800025A 110A      ASRS     r2,r1,#4
0x0800025C EBA271E1  SUB      r1,r2,r1,ASR #31
0x08000260 F06F0218  MVN      r2,#0x18
0x08000264 4351      MULS     r1,r2,r1
Код:
if (++count›=MAX) count = 0;

0x08000254 1C41      ADDS     r1,r0,#1
0x08000256 2932      CMP      r1,#0x32
0x08000258 BFA8      IT       GE
0x0800025A 2100      MOVGE    r1,#0x00
очевидно, что третий

Последний раз редактировалось dash; 13.08.2012 в 21:42. Причина: да опять промахнулся
dash вне форума  
Сказали "Спасибо" dash
warel (29.06.2019)
Непрочитано 13.08.2012, 21:14  
Hives
Гражданин KAZUS.RU
 
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
Hives на пути к лучшему
По умолчанию Re: Какой код быстрее(Си)?

dash или первый и третий. у третьего только c-код красивше.
Hives вне форума  
Сказали "Спасибо" Hives
warel (29.06.2019)
Непрочитано 13.08.2012, 21:21  
Catcatcat1
Прописка
 
Регистрация: 05.05.2007
Сообщений: 116
Сказал спасибо: 10
Сказали Спасибо 58 раз(а) в 34 сообщении(ях)
Catcatcat1 на пути к лучшему
По умолчанию Re: Какой код быстрее(Си)?

Запускаешь в стимуляторе и смотрись сколько, какой сколько тактов занимает.
Catcatcat1 вне форума  
Сказали "Спасибо" Catcatcat1
warel (29.06.2019)
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой контроллер быстрее дергает ногами ? cignal Микроконтроллеры, АЦП, память и т.д 32 28.03.2010 00:50
В какой программе компелить код (подключение #include ) FedorChek Микроконтроллеры, АЦП, память и т.д 4 04.05.2009 20:00
Во какой код-грабер! retas Отвлекитесь, эмбеддеры! 0 27.01.2009 20:41
преобразователь код-код zazan111 TTL и CMOS логика 18 05.01.2009 06:11
[Решено] Почему SATA быстрее ATA и т.д. Дима Делимся опытом 7 15.01.2004 22:41


Часовой пояс GMT +4, время: 14:48.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot