13.08.2012, 10:57
|
|
Прописка
Регистрация: 14.11.2007
Сообщений: 150
Сказал спасибо: 3
Сказали Спасибо 47 раз(а) в 43 сообщении(ях)
|
Какой код быстрее(Си)?
Приветствую!
Есть три реализации обнуления счетчика при достижении максимального значения:
Вариант 1:
Код:
|
(count›=MAX) ? (count=0) : (count++); |
Вариант 2:
Код:
|
count = (count+1) % MAX; |
Вариант 3:
Код:
|
if (++count›=MAX) count = 0; |
Какой из них оптимальней по быстродействию?
|
|
|
|
13.08.2012, 11:01
|
|
Гражданин KAZUS.RU
Регистрация: 17.11.2011
Адрес: Брянская область, РФ
Сообщений: 699
Сказал спасибо: 693
Сказали Спасибо 428 раз(а) в 213 сообщении(ях)
|
Re: Какой код быстрее(Си)?
открыть ассм и посмотреть
|
|
|
Сказали "Спасибо" aleksandr_zh
|
|
|
13.08.2012, 11:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Какой код быстрее(Си)?
...потом выкинуть из сгенерированного асма десяток ненужных команд, и оформить ассемблерной вставкой
|
|
|
Эти 2 пользователя(ей) сказали Спасибо niXto за это сообщение:
|
|
|
13.08.2012, 11:37
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
|
Re: Какой код быстрее(Си)?
svad0, Еще есть частный случай, если максимальное значение счетчика степень двойки .
где MAX степень двойки , а count - байт .
При компиляции- две инструкции на асме .
__________________
Осторожно , злой кот
Последний раз редактировалось dosikus; 13.08.2012 в 12:03.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо dosikus за это сообщение:
|
|
|
13.08.2012, 12:21
|
|
Прописка
Регистрация: 14.11.2007
Сообщений: 150
Сказал спасибо: 3
Сказали Спасибо 47 раз(а) в 43 сообщении(ях)
|
Re: Какой код быстрее(Си)?
dosikus, не совсем понятно как будет обнуляться сам счетчик.
Наверное имелось ввиду что-то типа этого:
Код:
|
count = (count++) & (MAX-1); |
Интересный вариант, спасибо.
|
|
|
|
13.08.2012, 13:14
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
|
Re: Какой код быстрее(Си)?
Сообщение от svad0
|
dosikus, не совсем понятно как будет обнуляться сам счетчик.
Наверное имелось ввиду что-то типа этого:
Код:
count = (count++) & (MAX-1);
|
Скорей так .
Код:
|
Counter++;
Counter&=0x03; |
Уже конкретный счетчик до 4х...
__________________
Осторожно , злой кот
Последний раз редактировалось dosikus; 13.08.2012 в 13:16.
|
|
|
Сказали "Спасибо" dosikus
|
|
|
13.08.2012, 13:27
|
|
Прописка
Регистрация: 29.10.2008
Сообщений: 272
Сказал спасибо: 0
Сказали Спасибо 102 раз(а) в 95 сообщении(ях)
|
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
|
|
|
13.08.2012, 19:42
|
|
Частый гость
Регистрация: 19.08.2004
Сообщений: 33
Сказал спасибо: 6
Сказали Спасибо 11 раз(а) в 9 сообщении(ях)
|
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.
Причина: да опять промахнулся
|
|
|
|
13.08.2012, 21:14
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: Какой код быстрее(Си)?
dash или первый и третий. у третьего только c-код красивше.
|
|
|
|
13.08.2012, 21:21
|
|
Прописка
Регистрация: 05.05.2007
Сообщений: 116
Сказал спасибо: 10
Сказали Спасибо 58 раз(а) в 34 сообщении(ях)
|
Re: Какой код быстрее(Си)?
Запускаешь в стимуляторе и смотрись сколько, какой сколько тактов занимает.
|
|
|
Сказали "Спасибо" Catcatcat1
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:48.
|
|