Перейти к содержанию
    

У меня мэйн функция выходит довольно большая. Многие куски кода можно было вынести в отдельные функции. Но мне важна скорость а переход в функцию и обратно это 4 такта если я не ошибаюсь. помножить на количество функций... или это уже паранойя? и еще я заметил если функцию вынести в отдельный модуль код увеличивается примерно на 100 байт.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня мэйн функция выходит довольно большая. Многие куски кода можно было вынести в отдельные функции. Но мне важна скорость а переход в функцию и обратно это 4 такта если я не ошибаюсь. помножить на количество функций... или это уже паранойя? и еще я заметил если функцию вынести в отдельный модуль код увеличивается примерно на 100 байт.

Это паранойя. Имеет право присутствовать (в разумных пределах) при написании специальных функций, например в прерывании или в ограниченном по объему пространстве (бутлоадер, например). Но никак не при простой писанине в main().

Если такты так критичны- значит что-то не так с выбором элементной базы (нет запаса по скорости/размеру памяти).

ну и инлайны никто не отменял.

 

Про размер: функция должна выполнять одну функцию, потому она и названа функцией :)

Не пихайте все вместе, никакого выигрыша это не принесет, одна головная боль.

 

P.S. Жена с кухни выгнала, делать нечего- вот и пишу любые ответы на любые вопросы. С наступающим! :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это паранойя. Имеет право присутствовать (в разумных пределах) при написании специальных функций, например в прерывании или в ограниченном по объему пространстве (бутлоадер, например). Но никак не при простой писанине в main().

Если такты так критичны- значит что-то не так с выбором элементной базы (нет запаса по скорости/размеру памяти).

ну и инлайны никто не отменял.

 

Про размер: функция должна выполнять одну функцию, потому она и названа функцией :)

Не пихайте все вместе, никакого выигрыша это не принесет, одна головная боль.

 

P.S. Жена с кухни выгнала, делать нечего- вот и пишу любые ответы на любые вопросы. С наступающим! :)

 

спасибо. с наступающим. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня мэйн функция выходит довольно большая. Многие куски кода можно было вынести в отдельные функции. Но мне важна скорость а переход в функцию и обратно это 4 такта если я не ошибаюсь. помножить на количество функций... или это уже паранойя? и еще я заметил если функцию вынести в отдельный модуль код увеличивается примерно на 100 байт.

4 такта это где? Может и больше быть.

Если вам надо сократить код, то в функцию выносим часто повторяющиеся куски кода.

Если надо ускорить работу, то не выносим, но тогда естественно объем кода увеличится.

Для удобства написания можно писать функции, но с ключевым словом inline - тогда код функции будет линейно включен в программу при компиляции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 такта это где? Может и больше быть.

Если вам надо сократить код, то в функцию выносим часто повторяющиеся куски кода.

Если надо ускорить работу, то не выносим, но тогда естественно объем кода увеличится.

в том то и был вопрос много ли я выигрываю не вынося код в отдельные функции

 

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

а где лучше прописать инлайновую функцию?

 

Как в месте вызова будет встроена inline функция, если текст ее не виден?

Отсюда и исходите.

 

 

в том то и был вопрос много ли я выигрываю не вынося код в отдельные функции

 

Важно, что вы теряете - понимание кода, понятную структуру, иерархию в проекте.

 

Сейчас все контроллеры стоят практически одинаково, что AVR, что CM4.

Есть ли смысл затруднять себе жизнь?

Кстати, если разрешить максимальную оптимизацию, то сам компилятор развернет некоторые функции.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, если разрешить максимальную оптимизацию, то сам компилятор развернет некоторые функции.

живой пример - Keil 5, последний

с -O0 размер кода 33кб

с -O3 - 22кб

с включенной Cross-Module optimization - 13(!!!)кб

 

правда, не смотрел, как там функции разворачиваются :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в том то и был вопрос много ли я выигрываю не вынося код в отдельные функции

Дак откуда же кто знает. Код у вас, берем и считаем на циклах которые критичны для вас по времени.

 

Сейчас все контроллеры стоят практически одинаково, что AVR, что CM4.

Есть ли смысл затруднять себе жизнь?

Т.е. надо затруднить себе жизнь освоением новой архитектуры или нового процессора? :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Т.е. надо затруднить себе жизнь освоением новой архитектуры или нового процессора?

Это рутинная работа, отсидеться в кустах все равно не получится.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня мэйн функция выходит довольно большая. Многие куски кода можно было вынести в отдельные функции. Но мне важна скорость а переход в функцию и обратно это 4 такта если я не ошибаюсь. помножить на количество функций... или это уже паранойя? и еще я заметил если функцию вынести в отдельный модуль код увеличивается примерно на 100 байт.

 

Каждый разработчик решает для себя сам исходя из размеров проекта, что использовать, какую методологию: спагетти-код (в Вашем случае), структурное, объектно-ориентированное программирование

 

Всё упирается в дальнейшую возможность поддержки и расширения. Если у Вас проект до 100 строк кода и завтра про него забудете навсегда зачем заморачиваться со структурой и тем более с проектированием объектов (классов).

 

PS Но вот если у Вас перспективы вырасти до 1 млн. строк кода то тут уже только объектно-ориентированное программирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня мэйн функция выходит довольно большая. Многие куски кода можно было вынести в отдельные функции. Но мне важна скорость а переход в функцию и обратно это 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

и никаких лишних вызовов

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

главное чтобы костюмчик сидел компилятор хороший был

Не уверен, что это корректный пример, с одной функцией в том же файле.

Более интересно такое:

 

typedef void (*tVECTOR)(void);
const tVECTOR function[stQTY] = {Reset, Init, Run, Failure};

void main(void)
{
    InitStateService();
    for (;;)
    {
        event=GetEvent();
        function[state]();
        event=0;
    }
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не уверен, что это корректный пример, с одной функцией в том же файле.

с чего вдруг один? три файла использовано, две компилируемых единицы...

 

Более интересно такое:

это кардинально противоположно тому, что хотел ТС...

 

 

а-а-а-а... понял, понял. НГ. Поправляйтесь))

 

 

 

Тем не менее

 

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>

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тем не менее

Дизассемблер в этом виде мало что дает, т.к. преамбулы не видны.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дизассемблер в этом виде мало что дает, т.к. преамбулы не видны.

вот для повышения общего уровня образования. скажите мне, что вам даст т.н. "преамбула"?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...