Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум


 
Опции темы

Какой код быстрее(Си)?

Непрочитано 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.RUN
 
Регистрация: 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.RUN
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,026
Сказал спасибо: 60
Сказали Спасибо 3,941 раз(а) в 2,302 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: Какой код быстрее(Си)?

...потом выкинуть из сгенерированного асма десяток ненужных команд, и оформить ассемблерной вставкой
niXto вне форума  
Эти 2 пользователя(ей) сказали Спасибо niXto за это сообщение:
aleksandr_zh (13.08.2012), warel (29.06.2019)
Непрочитано 13.08.2012, 11:37  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
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
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
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.RUN
 
Регистрация: 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
Сообщений: 115
Сказал спасибо: 10
Сказали Спасибо 57 раз(а) в 33 сообщении(ях)
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, время: 08:35.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.