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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Много мелких функций или одна большая?
GYUR22
сообщение Feb 11 2011, 12:39
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 16-02-09
Пользователь №: 44 931



Есть одна большая функция в программе - которую можно поделить на много мелких ...
Вопрос как выгоднее по скорости исполнения - разделить ее на 18 мелких (по смыслу) или оставить как есть?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 11 2011, 12:46
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Если мелкие сделать принудительно встраиваемыми - то по скорости будет одинаково. А читаемость исходника повысится.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Feb 11 2011, 12:56
Сообщение #3


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Сергей Борщ @ Feb 11 2011, 15:46) *
Если мелкие сделать принудительно встраиваемыми - то по скорости будет одинаково. А читаемость исходника повысится.

А если и не делать - может, ничего страшного и не произойдёт.
(какая разница, сколько процессор бездельничает в цикле IDLE - 97 или 98%..)


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
GYUR22
сообщение Feb 11 2011, 13:20
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 16-02-09
Пользователь №: 44 931



Эээ про Idle можно поподробнее?

ps эта функция исполняется раз в секунду но - ее исполнение может быть критичным по скорости ибо после нее идет обработка буфера uart (если он получил маркер - передача окончена) и посылка ответа
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Feb 11 2011, 13:46
Сообщение #5


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(GYUR22 @ Feb 11 2011, 16:20) *
Эээ про Idle можно поподробнее?

Я обычно большую массивную функцию (например, обсчёт данных с логарифмами, фильтрацией и формулами на полстраницы) делю на множество мелких подзадач, вешаю их на стейт-машину и запускаю всё это в общем цикле.
То есть, при каждой следующей итерации выполняется следующая подзадача, а в конце вся система переходит в IDLE.
В результате время отклика в общем суперцикле существенно уменьшается, а требования к быстродействию вычислений снижаются.

Естественно, это всё при отсутствии RTOS.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
GYUR22
сообщение Feb 11 2011, 13:52
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 16-02-09
Пользователь №: 44 931



богатая идея...
надо обмуслить...
тока общаяя схема у меня порушится т.к. 1 секундный маркер....
и втом теле еще несколько обработчиков...
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Feb 11 2011, 14:19
Сообщение #7


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(GYUR22 @ Feb 11 2011, 16:52) *
тока общаяя схема у меня порушится т.к. 1 секундный маркер....

Ничего не порушится.
Маркер пусть запускает процесс.
Вот для затравки:
CODE
void CalculateParameters(void)
{
static int stage = 0;
if( TimeToCalc)
{
switch(stage++)
{
case 0:
Calculate_T();
break;

case 1:
Calculate_V();
break;

case 2:
pH = GetpH(kappa, t);
break;

case 3:
Calculate_pNa(v);
break;

case 4:
Calculate_CNa();
break;

default:
TimeToCalc = 0;
stage = 0;
if(state == NoMeas)
{
state = NormalWork;
}

break;
}
}
}


CalculateParameters() вставляете в общий суперцикл, флажок TimeToCalc запускает процесс и обнуляется в конце.
Хотя, можно его "вынести за скобки"... Вариаций множество.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 11 2011, 15:51
Сообщение #8


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(MrYuran @ Feb 11 2011, 17:19) *
Вот для затравки:

И нафига оно такое надо?
Код
#define run_app(name) do{static bool lock=false; if(!lock){ lock=true;name();lock=false;}}while(0);
void idle(void)
{
  run_app(func_app1);
  run_app(func_app1);
  run_app(CalculateParameters);
}
// где-то тама...
void CalculateParameters(void)
{
    
    if(!TimeToCalc) return;
    Calculate_T();
              idle();
    Calculate_V();
              idle();
    pH = GetpH(kappa, t);
              idle();
    Calculate_pNa(v);
              idle();
    Calculate_CNa();                
              idle();
    TimeToCalc = 0;
}


biggrin.gif И где тут Protothreads, который я "при каждом удобном случае пиарю" ? ЫЫЫ!
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 12 2011, 07:53
Сообщение #9


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Сергей Борщ @ Feb 11 2011, 15:46) *
Если мелкие сделать принудительно встраиваемыми - то по скорости будет одинаково. А читаемость исходника повысится.

Достаточно их сделать статическими и компилятор их сам встроит если они вызываются лишь по разу.
2ТС:
Разбивайте всё по функциям на отдельные законченные логические блоки, чтобы была видна структура и прозрачны взаимосвязи.
Размер кода при этом не увеличиться ни на йоту.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
GYUR22
сообщение Feb 12 2011, 09:40
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 16-02-09
Пользователь №: 44 931



размер кода пока не пугает ...
оперативки уже мало 95% занято (структурой данных и 2мя буферами uart) ... тока на стэк как я понимаю осталось
с ассемблером я практически не знаком - но каждый вызов функции это прыжок по коду - занимающий циклы процессора если я не ошибаюсь
но если написать что она- inline без static то она интегрируется в то место где вызывается?

Сообщение отредактировал GYUR22 - Feb 12 2011, 09:46
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 12 2011, 10:15
Сообщение #11


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(GYUR22 @ Feb 12 2011, 13:40) *
но если написать что она- inline без static то она интегрируется в то место где вызывается?

Static inline делается для того, чтоб описать в хедере - тогда нету разницы, где и сколько раз оно описано. Все равно будет при вызове встроено
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 12 2011, 14:03
Сообщение #12


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(GYUR22 @ Feb 12 2011, 12:40) *
размер кода пока не пугает ...
оперативки уже мало 95% занято (структурой данных и 2мя буферами uart) ... тока на стэк как я понимаю осталось
с ассемблером я практически не знаком - но каждый вызов функции это прыжок по коду - занимающий циклы процессора если я не ошибаюсь
но если написать что она- inline без static то она интегрируется в то место где вызывается?

Не всегда, а по усмотрению компилятора.

Для всех функций не представленных в интерфейсе модуля (использующихся внутри одного модуля, иначе говоря файла) считается правилом хорошего тона присваивать квалификатор static. Это сообщает компилятору о возможности встраивания кода функции при оптимальных на его взгляд условиях. А компиляторы нынче весьма и весьма умные.

Использовать квалификатор inline имеет смысл лишь для замены макросов функциями по большей части в заголовочных файлах.

Придерживаясь этих нехитрых правил можно получить не только оптимальный но и самодокументированный код.

Для гарантированного встраивания функции при любых условиях можно использовать особенности различных компиляторов.
В gcc например есть механизм атрибутов:
Код
#define INLINE          __inline__ __attribute__((always_inline))

INLINE void vsegda_inline_func1(void);
INLINE void vsegda_inline_func2(void);
В других компиляторах используют механизм #pragma ...
Альтернатива - вечно зелёные и неувядающие макросы на все времена года:-)


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
GYUR22
сообщение Feb 14 2011, 11:16
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 58
Регистрация: 16-02-09
Пользователь №: 44 931



static inline - не компилируется... пишет что линкер не нашел функций...
inline - все нормально работает
в чем подвох?
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Feb 14 2011, 11:25
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



Цитата
static inline - не компилируется...


1. static inline функцию надо писать в h-файле, который надо подключить (#include) туда, где она будет вызываться

2. Пример написания static inline функции в h-файле (WinAVR)
Код
  static inline void delay_10ms (byte ms)  __attribute__((always_inline));
  void delay_10ms (byte ms)
   {
    for(byte i=0; i<ms; i++)
     {
      wdt_reset ();
      _delay_ms (10);
     }
   }
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Feb 14 2011, 11:36
Сообщение #15


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(_Pasha @ Feb 11 2011, 18:51) *
biggrin.gif И где тут Protothreads, который я "при каждом удобном случае пиарю" ? ЫЫЫ!

sm.gif
где-то валяется в пыльном углу, все никак руки не дойдут асилить...
laughing.gif
beer.gif

Цитата(alexeyv @ Feb 14 2011, 14:25) *
1. static inline функцию надо писать в h-файле, который надо подключить (#include) туда, где она будет вызываться

Можно и в .c, но только "для внутреннего употребления"
Короче говоря, static объявление действительно только внутри модуля, в котором оно объявлено.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 6th July 2025 - 23:26
Рейтинг@Mail.ru


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