реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Оптимизация кода.
Jenya7
сообщение Dec 31 2015, 07:50
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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

Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Dec 31 2015, 09:19
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(Jenya7 @ Dec 31 2015, 09:50) *
У меня мэйн функция выходит довольно большая. Многие куски кода можно было вынести в отдельные функции. Но мне важна скорость а переход в функцию и обратно это 4 такта если я не ошибаюсь. помножить на количество функций... или это уже паранойя? и еще я заметил если функцию вынести в отдельный модуль код увеличивается примерно на 100 байт.

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

Про размер: функция должна выполнять одну функцию, потому она и названа функцией sm.gif
Не пихайте все вместе, никакого выигрыша это не принесет, одна головная боль.

P.S. Жена с кухни выгнала, делать нечего- вот и пишу любые ответы на любые вопросы. С наступающим! sm.gif
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Dec 31 2015, 09:28
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Ruslan1 @ Dec 31 2015, 14:19) *
Это паранойя. Имеет право присутствовать (в разумных пределах) при написании специальных функций, например в прерывании или в ограниченном по объему пространстве (бутлоадер, например). Но никак не при простой писанине в main().
Если такты так критичны- значит что-то не так с выбором элементной базы (нет запаса по скорости/размеру памяти).
ну и инлайны никто не отменял.

Про размер: функция должна выполнять одну функцию, потому она и названа функцией sm.gif
Не пихайте все вместе, никакого выигрыша это не принесет, одна головная боль.

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


спасибо. с наступающим. sm.gif
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Dec 31 2015, 10:39
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



Цитата(Jenya7 @ Dec 31 2015, 13:50) *
У меня мэйн функция выходит довольно большая. Многие куски кода можно было вынести в отдельные функции. Но мне важна скорость а переход в функцию и обратно это 4 такта если я не ошибаюсь. помножить на количество функций... или это уже паранойя? и еще я заметил если функцию вынести в отдельный модуль код увеличивается примерно на 100 байт.

4 такта это где? Может и больше быть.
Если вам надо сократить код, то в функцию выносим часто повторяющиеся куски кода.
Если надо ускорить работу, то не выносим, но тогда естественно объем кода увеличится.
Для удобства написания можно писать функции, но с ключевым словом inline - тогда код функции будет линейно включен в программу при компиляции.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Dec 31 2015, 11:38
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(HardEgor @ Dec 31 2015, 15:39) *
4 такта это где? Может и больше быть.
Для удобства написания можно писать функции, но с ключевым словом inline - тогда код функции будет линейно включен в программу при компиляции.

а где лучше прописать инлайновую функцию?
так
Код
module.h
static inline void Func(void)
{
     // do something
}

или так
Код
module.h
void Func(void);

module.c
inline void Func(void)
{
     // do something
}


Цитата(HardEgor @ Dec 31 2015, 15:39) *
4 такта это где? Может и больше быть.
Если вам надо сократить код, то в функцию выносим часто повторяющиеся куски кода.
Если надо ускорить работу, то не выносим, но тогда естественно объем кода увеличится.

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


Сообщение отредактировал Jenya7 - Dec 31 2015, 11:41
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Dec 31 2015, 12:15
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823




Цитата(Jenya7 @ Dec 31 2015, 14:38) *
а где лучше прописать инлайновую функцию?


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


Цитата(Jenya7 @ Dec 31 2015, 14:38) *
в том то и был вопрос много ли я выигрываю не вынося код в отдельные функции


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

Сейчас все контроллеры стоят практически одинаково, что AVR, что CM4.
Есть ли смысл затруднять себе жизнь?
Кстати, если разрешить максимальную оптимизацию, то сам компилятор развернет некоторые функции.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
toweroff
сообщение Dec 31 2015, 12:23
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(Dog Pawlowa @ Dec 31 2015, 15:15) *
Кстати, если разрешить максимальную оптимизацию, то сам компилятор развернет некоторые функции.

живой пример - Keil 5, последний
с -O0 размер кода 33кб
с -O3 - 22кб
с включенной Cross-Module optimization - 13(!!!)кб

правда, не смотрел, как там функции разворачиваются sm.gif
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Dec 31 2015, 12:33
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



Цитата(Jenya7 @ Dec 31 2015, 17:38) *
в том то и был вопрос много ли я выигрываю не вынося код в отдельные функции

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

Цитата(Dog Pawlowa @ Dec 31 2015, 18:15) *
Сейчас все контроллеры стоят практически одинаково, что AVR, что CM4.
Есть ли смысл затруднять себе жизнь?

Т.е. надо затруднить себе жизнь освоением новой архитектуры или нового процессора? sm.gif
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Dec 31 2015, 19:37
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(HardEgor @ Dec 31 2015, 15:33) *
Т.е. надо затруднить себе жизнь освоением новой архитектуры или нового процессора?

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


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
SlavaV
сообщение Jan 1 2016, 03:11
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 100
Регистрация: 13-06-06
Из: г.Улан-Удэ
Пользователь №: 18 024



Цитата(Jenya7 @ Dec 31 2015, 15:50) *
У меня мэйн функция выходит довольно большая. Многие куски кода можно было вынести в отдельные функции. Но мне важна скорость а переход в функцию и обратно это 4 такта если я не ошибаюсь. помножить на количество функций... или это уже паранойя? и еще я заметил если функцию вынести в отдельный модуль код увеличивается примерно на 100 байт.


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

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

PS Но вот если у Вас перспективы вырасти до 1 млн. строк кода то тут уже только объектно-ориентированное программирование
Go to the top of the page
 
+Quote Post
smalcom
сообщение Jan 2 2016, 22:08
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



Цитата(Jenya7 @ Dec 31 2015, 09:50) *
У меня мэйн функция выходит довольно большая. Многие куски кода можно было вынести в отдельные функции. Но мне важна скорость а переход в функцию и обратно это 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

и никаких лишних вызовов
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jan 3 2016, 02:53
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(smalcom @ Jan 3 2016, 01:08) *
главное чтобы костюмчик сидел компилятор хороший был

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

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

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



--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
smalcom
сообщение Jan 3 2016, 13:30
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



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

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

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

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


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



Тем не менее

Цитата
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>

Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jan 3 2016, 15:04
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(smalcom @ Jan 3 2016, 16:30) *
Тем не менее

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


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
smalcom
сообщение Jan 3 2016, 19:36
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



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

вот для повышения общего уровня образования. скажите мне, что вам даст т.н. "преамбула"?
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 13:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.0151 секунд с 7
ELECTRONIX ©2004-2016