Какой код быстрее(Си)?
14.08.2012, 21:08
|
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
|
Re: Какой код быстрее(Си)?
Сообщение от =GM=
|
|
А вообще, кто бы объяснил: в ветке обсуждается вопрос на си, но за каким-то чертом сишники лезут в ассемблерный листинг, зачем?
|
Однако вы так разве не делаете ? Всегда полезно знать во что ваш бред обернулся ...
__________________
Осторожно , злой кот
|
|
|
|
14.08.2012, 21:54
|
|
|
Вид на жительство
Регистрация: 10.08.2005
Сообщений: 385
Сказал спасибо: 0
Сказали Спасибо 161 раз(а) в 140 сообщении(ях)
|
Re: Какой код быстрее(Си)?
|
|
|
|
Сказали "Спасибо" Alecsej
|
|
|
15.08.2012, 00:11
|
|
|
Частый гость
Регистрация: 19.08.2004
Сообщений: 33
Сказал спасибо: 6
Сказали Спасибо 11 раз(а) в 9 сообщении(ях)
|
Re: Какой код быстрее(Си)?
Сообщение от =GM=
|
|
А вообще, кто бы объяснил: в ветке обсуждается вопрос на си, но за каким-то чертом сишники лезут в ассемблерный листинг, зачем?
|
кто-то из великих (по моему это Керниган) сказал что-то вроде "легко писать на С, когда знаешь как каждая строчка компилируется в ассемблер". я всеми рукам и ногами "за" 
и когда подтягиваюсь на очередной контроллер сразу же изучаю как что компилится, дабы сразу писать эффективный код. хотя последнее время начинаю замечать: компилеры стали очень умными, так что все изощрения их только сбивают с толку. сейчас им надо максимально тупо объяснить, что нужно сделать, соптимизят они сами. в итоге третий вариант победил 
а на счет эффективности - а вдруг ТС нужно этот код в обработчик прерывания поставить.
кстати, не знаю, с чего я взял, что надо компилить под ARM... видимо перед этим читал какой-то другой топик про ARM  сорри
|
|
|
|
Эти 2 пользователя(ей) сказали Спасибо dash за это сообщение:
|
|
|
15.08.2012, 00:11
|
|
|
Прописка
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
|
ха-р-р-о-ший документ, да
Впрочем, посмотрел по диагонали, немного надуманно. Вот на странице 6 приводят пример, как сэкономить 2 байта в теле цикла, типа надо использовать декремент, а не инкремент
int main(void)
{
uint8 local=0;
do
{
PORTB ^=0x01;
local++;
}
while(local‹100);
}
Утверждают, что здесь на два байта больше, чем во фрагменте ниже
int main(void)
{
uint8 local=100;
do
{
PORTB ^=0x01;
local--;
}
while(local);
}
Идиоты! И с инкрементом можно написать фрагмент такой же длины
int main(void)
{
uint8 local=255-99;
do
{
PORTB ^=0x01;
local++;
}
while(local);
}
|
|
|
|
15.08.2012, 00:37
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,042
Сказал спасибо: 589
Сказали Спасибо 3,967 раз(а) в 1,825 сообщении(ях)
|
Re: ха-р-р-о-ший документ, да
Сообщение от =GM=
|
int main(void)
{
uint8 local=0;
do
{
PORTB ^=0x01;
local++;
}
while(local‹100);
}
Утверждают, что здесь на два байта больше, чем во фрагменте ниже
int main(void)
{
uint8 local=100;
do
{
PORTB ^=0x01;
local--;
}
while(local);
}
|
В ASCII так точно.
|
|
|
|
15.08.2012, 10:49
|
|
|
Частый гость
Регистрация: 02.10.2009
Сообщений: 18
Сказал спасибо: 3
Сказали Спасибо 3 раз(а) в 2 сообщении(ях)
|
Re: Какой код быстрее(Си)?
а как Вам такой код:
count = MAX;
...
if( count-- )
{
/* operations */
}
else
{
count = MAX;
}
я обычно так действую
|
|
|
|
15.08.2012, 12:49
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Какой код быстрее(Си)?
Сообщение от vasenik
|
а как Вам такой код:
|
Код:
|
count = MAX;
...
if( count-- )
{
/* operations */
}
else
{
count = MAX;
} |
я обычно так действую
|
Смотря что вы задумали. Если вам нужно исключить /* operation */ при нулевом значении счетчика, тогда да. Это обычно делают тогда, когда текущее состояние счетчика не имеет значения, а важно количество итераций. Нужно быть внимательным.
__________________
С уважением,
Vic / ut1wpr
|
|
|
|
15.08.2012, 14:40
|
|
|
Частый гость
Регистрация: 02.10.2009
Сообщений: 18
Сказал спасибо: 3
Сказали Спасибо 3 раз(а) в 2 сообщении(ях)
|
Re: Какой код быстрее(Си)?
|
|
|
|
15.08.2012, 18:00
|
|
|
Частый гость
Регистрация: 12.10.2010
Сообщений: 27
Сказал спасибо: 0
Сказали Спасибо 19 раз(а) в 14 сообщении(ях)
|
Re: ха-р-р-о-ший документ, да
Сообщение от =GM=
|
Впрочем, посмотрел по диагонали, немного надуманно. Вот на странице 6 приводят пример, как сэкономить 2 байта в теле цикла, типа надо использовать декремент, а не инкремент
[...]
|
Ну... не надо считать себя умнее хорошего оптимизирующего компилятора
Я как-то тоже в одном критическом кусочке кода пытался умничать и "оптимизировать" на С, долго выбирал между конструкциями типа:
void Foo(uint32_t aInp)
{
(1) uint32_t val = aInp & 0xFFFF0000;
(2) uint32_t val = (aInp ››16) ‹‹ 16;
}
В результате поглядел в ассемблерный листинг и увидел, что RVCT сгенерировал абсолютно одинаковый код для обеих случаев, оптимальный с его точки зрения.
Опять же, "premature optimisation is a root of all evil" (c).
Попытка "теоретической экономии" пары байтиков без четкого понимания, нужно ли это и критериев оценки, ничего, кроме потери времени может и не принести
Хотя, безусловно, некоторые особенности реализации надо знать, типа различного поведения пост и пре- декремента для non-POD объектов с С++. Тут уж компилятор может и не помочь..
|
|
|
|
18.08.2012, 19:34
|
|
|
Частый гость
Регистрация: 29.05.2010
Адрес: Армения, Гюмри
Сообщений: 19
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
Re: Какой код быстрее(Си)?
Добрый вечер!
Позвольте выразить мое мнение про Си и Ассемблер. На Си гораздо легче
написать программы, чем на Ассемблере. Ассемблер требует более глубокие знания микроконтроллера. Программа на СИ похож на черный ящик, компилятор сам находит все регистры, область памяти и сам впыхает туда программу и данные. Там все зависит ни от Вас, а от того программиста, кто написал код компилятора. А на Ассемблере
микроконтроллер как на ладонии, все видно и ты можешь от МК взять максимум, будет глюк, ошибка, сразу можно найти ошибку и принять меры, исправить все. И учтите, программа на Ассемблере на кристалле занимает 3 раза меньше места, чем на СИ. Если вы всерьез занимаетесь программированием МК, то лучше Ассемблер. Я долгое время занимаюсь программированием МК, преподаю, и и пришел к такому выводу. Удачи всем !!!
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:29.
|
|