jenya7 0 31 декабря, 2015 Опубликовано 31 декабря, 2015 · Жалоба У меня мэйн функция выходит довольно большая. Многие куски кода можно было вынести в отдельные функции. Но мне важна скорость а переход в функцию и обратно это 4 такта если я не ошибаюсь. помножить на количество функций... или это уже паранойя? и еще я заметил если функцию вынести в отдельный модуль код увеличивается примерно на 100 байт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 16 31 декабря, 2015 Опубликовано 31 декабря, 2015 · Жалоба У меня мэйн функция выходит довольно большая. Многие куски кода можно было вынести в отдельные функции. Но мне важна скорость а переход в функцию и обратно это 4 такта если я не ошибаюсь. помножить на количество функций... или это уже паранойя? и еще я заметил если функцию вынести в отдельный модуль код увеличивается примерно на 100 байт. Это паранойя. Имеет право присутствовать (в разумных пределах) при написании специальных функций, например в прерывании или в ограниченном по объему пространстве (бутлоадер, например). Но никак не при простой писанине в main(). Если такты так критичны- значит что-то не так с выбором элементной базы (нет запаса по скорости/размеру памяти). ну и инлайны никто не отменял. Про размер: функция должна выполнять одну функцию, потому она и названа функцией :) Не пихайте все вместе, никакого выигрыша это не принесет, одна головная боль. P.S. Жена с кухни выгнала, делать нечего- вот и пишу любые ответы на любые вопросы. С наступающим! :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 31 декабря, 2015 Опубликовано 31 декабря, 2015 · Жалоба Это паранойя. Имеет право присутствовать (в разумных пределах) при написании специальных функций, например в прерывании или в ограниченном по объему пространстве (бутлоадер, например). Но никак не при простой писанине в main(). Если такты так критичны- значит что-то не так с выбором элементной базы (нет запаса по скорости/размеру памяти). ну и инлайны никто не отменял. Про размер: функция должна выполнять одну функцию, потому она и названа функцией :) Не пихайте все вместе, никакого выигрыша это не принесет, одна головная боль. P.S. Жена с кухни выгнала, делать нечего- вот и пишу любые ответы на любые вопросы. С наступающим! :) спасибо. с наступающим. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 63 31 декабря, 2015 Опубликовано 31 декабря, 2015 · Жалоба У меня мэйн функция выходит довольно большая. Многие куски кода можно было вынести в отдельные функции. Но мне важна скорость а переход в функцию и обратно это 4 такта если я не ошибаюсь. помножить на количество функций... или это уже паранойя? и еще я заметил если функцию вынести в отдельный модуль код увеличивается примерно на 100 байт. 4 такта это где? Может и больше быть. Если вам надо сократить код, то в функцию выносим часто повторяющиеся куски кода. Если надо ускорить работу, то не выносим, но тогда естественно объем кода увеличится. Для удобства написания можно писать функции, но с ключевым словом inline - тогда код функции будет линейно включен в программу при компиляции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 31 декабря, 2015 Опубликовано 31 декабря, 2015 (изменено) · Жалоба 4 такта это где? Может и больше быть. Для удобства написания можно писать функции, но с ключевым словом inline - тогда код функции будет линейно включен в программу при компиляции. а где лучше прописать инлайновую функцию? так module.h static inline void Func(void) { // do something } или так module.h void Func(void); module.c inline void Func(void) { // do something } 4 такта это где? Может и больше быть. Если вам надо сократить код, то в функцию выносим часто повторяющиеся куски кода. Если надо ускорить работу, то не выносим, но тогда естественно объем кода увеличится. в том то и был вопрос много ли я выигрываю не вынося код в отдельные функции Изменено 31 декабря, 2015 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 31 декабря, 2015 Опубликовано 31 декабря, 2015 · Жалоба а где лучше прописать инлайновую функцию? Как в месте вызова будет встроена inline функция, если текст ее не виден? Отсюда и исходите. в том то и был вопрос много ли я выигрываю не вынося код в отдельные функции Важно, что вы теряете - понимание кода, понятную структуру, иерархию в проекте. Сейчас все контроллеры стоят практически одинаково, что AVR, что CM4. Есть ли смысл затруднять себе жизнь? Кстати, если разрешить максимальную оптимизацию, то сам компилятор развернет некоторые функции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 0 31 декабря, 2015 Опубликовано 31 декабря, 2015 · Жалоба Кстати, если разрешить максимальную оптимизацию, то сам компилятор развернет некоторые функции. живой пример - Keil 5, последний с -O0 размер кода 33кб с -O3 - 22кб с включенной Cross-Module optimization - 13(!!!)кб правда, не смотрел, как там функции разворачиваются :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 63 31 декабря, 2015 Опубликовано 31 декабря, 2015 · Жалоба в том то и был вопрос много ли я выигрываю не вынося код в отдельные функции Дак откуда же кто знает. Код у вас, берем и считаем на циклах которые критичны для вас по времени. Сейчас все контроллеры стоят практически одинаково, что AVR, что CM4. Есть ли смысл затруднять себе жизнь? Т.е. надо затруднить себе жизнь освоением новой архитектуры или нового процессора? :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 31 декабря, 2015 Опубликовано 31 декабря, 2015 · Жалоба Т.е. надо затруднить себе жизнь освоением новой архитектуры или нового процессора? Это рутинная работа, отсидеться в кустах все равно не получится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SlavaV 0 1 января, 2016 Опубликовано 1 января, 2016 · Жалоба У меня мэйн функция выходит довольно большая. Многие куски кода можно было вынести в отдельные функции. Но мне важна скорость а переход в функцию и обратно это 4 такта если я не ошибаюсь. помножить на количество функций... или это уже паранойя? и еще я заметил если функцию вынести в отдельный модуль код увеличивается примерно на 100 байт. Каждый разработчик решает для себя сам исходя из размеров проекта, что использовать, какую методологию: спагетти-код (в Вашем случае), структурное, объектно-ориентированное программирование Всё упирается в дальнейшую возможность поддержки и расширения. Если у Вас проект до 100 строк кода и завтра про него забудете навсегда зачем заморачиваться со структурой и тем более с проектированием объектов (классов). PS Но вот если у Вас перспективы вырасти до 1 млн. строк кода то тут уже только объектно-ориентированное программирование Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smalcom 0 2 января, 2016 Опубликовано 2 января, 2016 · Жалоба У меня мэйн функция выходит довольно большая. Многие куски кода можно было вынести в отдельные функции. Но мне важна скорость а переход в функцию и обратно это 4 такта если я не ошибаюсь. помножить на количество функций... или это уже паранойя? и еще я заметил если функцию вынести в отдельный модуль код увеличивается примерно на 100 байт. главное чтобы костюмчик сидел компилятор хороший был smalcom [ ~/test_gc ]$ cat mod.h mod.c main.c int foo(int p); int foo(int p) { volatile int t; t = p * 2; return t * 2; } #include "mod.h" int main() { volatile int k = 4; k = foo(k); return 0; } smalcom [ ~/test_gc ]$ gcc -c main.c -flto -O2 -o main.o && gcc -c mod.c -flto -O2 -o mod.o && gcc main.o mod.o -flto -O2 -o prog1 smalcom [ ~/test_gc ]$ objdump -h -S ./prog1 | grep \<main\> -A 12 00000000004003a0 <main>: 4003a0: c7 44 24 f8 04 00 00 movl $0x4,-0x8(%rsp) 4003a7: 00 4003a8: 8b 44 24 f8 mov -0x8(%rsp),%eax 4003ac: 01 c0 add %eax,%eax 4003ae: 89 44 24 fc mov %eax,-0x4(%rsp) 4003b2: 8b 44 24 fc mov -0x4(%rsp),%eax 4003b6: 01 c0 add %eax,%eax 4003b8: 89 44 24 f8 mov %eax,-0x8(%rsp) 4003bc: 31 c0 xor %eax,%eax 4003be: c3 retq 4003bf: 90 nop и никаких лишних вызовов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 3 января, 2016 Опубликовано 3 января, 2016 · Жалоба главное чтобы костюмчик сидел компилятор хороший был Не уверен, что это корректный пример, с одной функцией в том же файле. Более интересно такое: typedef void (*tVECTOR)(void); const tVECTOR function[stQTY] = {Reset, Init, Run, Failure}; void main(void) { InitStateService(); for (;;) { event=GetEvent(); function[state](); event=0; } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smalcom 0 3 января, 2016 Опубликовано 3 января, 2016 · Жалоба Не уверен, что это корректный пример, с одной функцией в том же файле. с чего вдруг один? три файла использовано, две компилируемых единицы... Более интересно такое: это кардинально противоположно тому, что хотел ТС... а-а-а-а... понял, понял. НГ. Поправляйтесь)) Тем не менее typedef void (*tVECTOR)(void); void Reset() {} void Init() {} void Run() {} void Failure() {} void InitStateService() {} int GetEvent() {} const tVECTOR function[] = {Reset, Init, Run, Failure}; int event; int state; void main(void) { InitStateService(); for (;;) { event=GetEvent(); function[state](); event=0; } } без оптимизации 00000000004004b0 <main>: 4004b0: 55 push %rbp 4004b1: 48 89 e5 mov %rsp,%rbp 4004b4: b8 00 00 00 00 mov $0x0,%eax 4004b9: e8 e4 ff ff ff callq 4004a2 <InitStateService> 4004be: b8 00 00 00 00 mov $0x0,%eax 4004c3: e8 e1 ff ff ff callq 4004a9 <GetEvent> 4004c8: 89 05 3e 05 20 00 mov %eax,0x20053e(%rip) # 600a0c <event> 4004ce: 8b 05 3c 05 20 00 mov 0x20053c(%rip),%eax # 600a10 <state> 4004d4: 48 98 cltq 4004d6: 48 8b 04 c5 a0 05 40 mov 0x4005a0(,%rax,8),%rax 4004dd: 00 4004de: ff d0 callq *%rax 4004e0: c7 05 22 05 20 00 00 movl $0x0,0x200522(%rip) # 600a0c <event> 4004e7: 00 00 00 4004ea: eb d2 jmp 4004be <main+0xe> 4004ec: 0f 1f 40 00 nopl 0x0(%rax) -O2 -flto 00000000004003a0 <main>: 4003a0: eb fe jmp 4003a0 <main> Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 3 января, 2016 Опубликовано 3 января, 2016 · Жалоба Тем не менее Дизассемблер в этом виде мало что дает, т.к. преамбулы не видны. А вообще напрашивается вывод, что нужно правильно закладывать ресурсы, чтобы хватало на все, в том числе на структурирование проекта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smalcom 0 3 января, 2016 Опубликовано 3 января, 2016 · Жалоба Дизассемблер в этом виде мало что дает, т.к. преамбулы не видны. вот для повышения общего уровня образования. скажите мне, что вам даст т.н. "преамбула"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться