Оптимизация выполнения большого числа функций

Я написал, что заранее известны только N и M.
А вот такой код в этом примере работать будет?:

void setup {
   int x = 3, y = 1;
   myFunc<x, y>();
}

Будет, если х и у - константы

В том-то и дело!
Похоже, что вы не поняли задачи. До компиляции известно только какие значения могут принимать параметры arg1 и arg2, Точнее диапазон значений. А какие они будут при вызове myFunc - заранее не известно. Если бы это было известно сразу, зачем мне эти танцы с бубном, я просто бы выполнял необходимые действия. А в данном случае мой пример без шаблонов правильный. Вообще, шаблоны нужны для упрощения написания кода и обрабатываются на этапе компиляции и в моем случае они ни как не помогут.

Это как? Ну, кроме объявления типа.
Или значения на момент компиляции известны не компилятору а ТСу? Тогда понятно))

Что-то какая-то дичь…
Напрашивается только switch, либо таблица вида

void(*)(void) mass[N];

где индекс массива соответствует значению arg1, а значение ячейки содержит указатель на функцию.

1 лайк

Псевдокод:

//макрос инстанцирует функцию и ассоциирует ее с динамическим значением параметров
#define REG_FUNC(X,Y) register(X,Y, myFunc<X,Y>())

//темплейты из примеров выше
template<int A, int B>
void myFunc() {
  Serial.println("Заглушка");
}
template<>
void myFunc<3,2>() {
  Serial.println("3-2 called! ");
}
template<>
void myFunc<1,2>() {
  Serial.println("1-2 called! ");
}
template<>
void myFunc<1,1>() {
  Serial.println("1-1 called! ");
}

void register(int x, int y, void (*pF)())
{
    doFunc[x][y] = pF; // массив doFunc из примеров выше, изначально заполнен 0
}

void setup()
{
   //регистрация известных комбинаций
   REG_FUNC(3,2);
   REG_FUNC(1,2);
   REG_FUNC(1,1);
   REG_FUNC(5,6);

   //вызовы
   doProc(3,2); //doProc из примеров выше
   doProc(1,1);
   doProc(5,6);
   doProc(7,8);
}

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

Писал на глазок (чисто на идею), мог немного с синтаксисом ошибиться.

Массив должен быть двумерный. Мы имеем два параметра arg1 и arg2.

Вот еще один вариант придумал. Хорошо оптимизирует по размеру. Да, забыл обратить на это внимание. При сочетании некоторых параметров, должны выполняться одни и те же действия ( бывает редко), а иногда вообще действия не нужны. Следующий вариант хорошо с этим справляется:

switch (arg1 * 100 + arg2) {
  case 101:   // (1, 1)
    ...
    break;
  case 302:   // (3, 2)
    ...
    break;
  case  505:  // (5, 5) и (14, 7)
  case 1407:  
    ...
    break;
}

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

Arg1 это величина некоего параметра, а arg2 режим работы. Я правильно понимаю?
Меня терзают смутные сомнения в правильности постановки задачи. Не припомню где при разных значениях на входе понадобились бы разные функции.
Да и есть разница, или параметров 0-5, или 0-500. Подход может быть совершенно разный.

3 лайка

В постановке задачи не указан критерий оптимизации: скорость, объем, масштабируемость… Вообще до возникновения проблем заниматься преждевременной оптимизацией не рационально.

Если бы был конкретный пример по данному устройству, что за датчики, какие значения и какие действия, можно было бы попредлагать. А так абстрактные идеи выдвинуты, автору решать с чем ему приятнее жить. Только что ООП с его полиморфизмом еще не предложили.

2 лайка

Первый вариант лучше. Во втором у тебя может switch() разрастись в нечитаемое.

а чем if плох ?)))
символы по крайней мере меняет быстро
for (int i = 0; i < 64; i++) {
if (receivedData[i] == ' ') { modifiedData[modifiedIndex++] = '0'; modifiedData[modifiedIndex++] = '1';
} else if (receivedData[i] == '!') {modifiedData[modifiedIndex++] = '0'; modifiedData[modifiedIndex++] = '2';
} else if (receivedData[i] == '"') {modifiedData[modifiedIndex++] = '0'; modifiedData[modifiedIndex++] = '3';
} else if (receivedData[i] == '#') {modifiedData[modifiedIndex++] = '0'; modifiedData[modifiedIndex++] = '4';
} else if (receivedData[i] == '$') {modifiedData[modifiedIndex++] = '0'; modifiedData[modifiedIndex++] = '5';
} else if (receivedData[i] == '%') {modifiedData[modifiedIndex++] = '0'; modifiedData[modifiedIndex++] = '6';
} else if (receivedData[i] == '&') {modifiedData[modifiedIndex++] = '0'; modifiedData[modifiedIndex++] = '7';
} else if (receivedData[i] == '\'') {modifiedData[modifiedIndex++] = '0'; modifiedData[modifiedIndex++] = '8';
} else if (receivedData[i] == '(') {modifiedData[modifiedIndex++] = '0'; modifiedData[modifiedIndex++] = '9';
} else if (receivedData[i] == ')') {modifiedData[modifiedIndex++] = '1'; modifiedData[modifiedIndex++] = '0';
} else if (receivedData[i] == '*') {modifiedData[modifiedIndex++] = '1'; modifiedData[modifiedIndex++] = '1';
} else if (receivedData[i] == '+') {modifiedData[modifiedIndex++] = '1'; modifiedData[modifiedIndex++] = '2';
} else if (receivedData[i] == ',') {modifiedData[modifiedIndex++] = '1'; modifiedData[modifiedIndex++] = '3';
} else if (receivedData[i] == '-') {modifiedData[modifiedIndex++] = '1'; modifiedData[modifiedIndex++] = '4';
} else if (receivedData[i] == '.') {modifiedData[modifiedIndex++] = '1'; modifiedData[modifiedIndex++] = '5';
} else if (receivedData[i] == '/') {modifiedData[modifiedIndex++] = '1'; modifiedData[modifiedIndex++] = '6';
} else if (receivedData[i] == '0') {modifiedData[modifiedIndex++] = '1'; modifiedData[modifiedIndex++] = '7';
} else if (receivedData[i] == '1') {modifiedData[modifiedIndex++] = '1'; modifiedData[modifiedIndex++] = '8';
} else if (receivedData[i] == '2') {modifiedData[modifiedIndex++] = '1'; modifiedData[modifiedIndex++] = '9';
} else if (receivedData[i] == '3') {modifiedData[modifiedIndex++] = '2'; modifiedData[modifiedIndex++] = '0';
} else if (receivedData[i] == '4') {modifiedData[modifiedIndex++] = '2'; modifiedData[modifiedIndex++] = '1';
} else if (receivedData[i] == '5') {modifiedData[modifiedIndex++] = '2'; modifiedData[modifiedIndex++] = '2';
} else if (receivedData[i] == '6') {modifiedData[modifiedIndex++] = '2'; modifiedData[modifiedIndex++] = '3';
} else if (receivedData[i] == '7') {modifiedData[modifiedIndex++] = '2'; modifiedData[modifiedIndex++] = '4';
} else if (receivedData[i] == '8') {modifiedData[modifiedIndex++] = '2'; modifiedData[modifiedIndex++] = '5';
} else if (receivedData[i] == '9') {modifiedData[modifiedIndex++] = '2'; modifiedData[modifiedIndex++] = '6';
} else if (receivedData[i] == ':') {modifiedData[modifiedIndex++] = '2'; modifiedData[modifiedIndex++] = '7';
} else if (receivedData[i] == ';') {modifiedData[modifiedIndex++] = '2'; modifiedData[modifiedIndex++] = '8';
} else if (receivedData[i] == '<') {modifiedData[modifiedIndex++] = '2'; modifiedData[modifiedIndex++] = '9';
} else if (receivedData[i] == '=') {modifiedData[modifiedIndex++] = '3'; modifiedData[modifiedIndex++] = '0';
} else if (receivedData[i] == '>') {modifiedData[modifiedIndex++] = '3'; modifiedData[modifiedIndex++] = '1';
} else if (receivedData[i] == '?') {modifiedData[modifiedIndex++] = '3'; modifiedData[modifiedIndex++] = '2';
} else if (receivedData[i] == '@') {modifiedData[modifiedIndex++] = '3'; modifiedData[modifiedIndex++] = '3';
} else if (receivedData[i] == 'A') {modifiedData[modifiedIndex++] = '3'; modifiedData[modifiedIndex++] = '4';
} else if (receivedData[i] == 'B') {modifiedData[modifiedIndex++] = '3'; modifiedData[modifiedIndex++] = '5';
} else if (receivedData[i] == 'C') {modifiedData[modifiedIndex++] = '3'; modifiedData[modifiedIndex++] = '6';
} else if (receivedData[i] == 'D') {modifiedData[modifiedIndex++] = '3'; modifiedData[modifiedIndex++] = '7';
} else if (receivedData[i] == 'E') {modifiedData[modifiedIndex++] = '3'; modifiedData[modifiedIndex++] = '8';
} else if (receivedData[i] == 'F') {modifiedData[modifiedIndex++] = '3'; modifiedData[modifiedIndex++] = '9';
} else if (receivedData[i] == 'G') {modifiedData[modifiedIndex++] = '4'; modifiedData[modifiedIndex++] = '0';
} else if (receivedData[i] == 'H') {modifiedData[modifiedIndex++] = '4'; modifiedData[modifiedIndex++] = '1';
} else if (receivedData[i] == 'I') {modifiedData[modifiedIndex++] = '4'; modifiedData[modifiedIndex++] = '2';
} else if (receivedData[i] == 'J') {modifiedData[modifiedIndex++] = '4'; modifiedData[modifiedIndex++] = '3';
} else if (receivedData[i] == 'K') {modifiedData[modifiedIndex++] = '4'; modifiedData[modifiedIndex++] = '4';
} else if (receivedData[i] == 'L') {modifiedData[modifiedIndex++] = '4'; modifiedData[modifiedIndex++] = '5';
} else if (receivedData[i] == 'M') {modifiedData[modifiedIndex++] = '4'; modifiedData[modifiedIndex++] = '6';
} else if (receivedData[i] == 'N') {modifiedData[modifiedIndex++] = '4'; modifiedData[modifiedIndex++] = '7';
} else if (receivedData[i] == 'O') {modifiedData[modifiedIndex++] = '4'; modifiedData[modifiedIndex++] = '8';
} else if (receivedData[i] == 'P') {modifiedData[modifiedIndex++] = '4'; modifiedData[modifiedIndex++] = '9';
} else if (receivedData[i] == 'Q') {modifiedData[modifiedIndex++] = '5'; modifiedData[modifiedIndex++] = '0';
} else if (receivedData[i] == 'R') {modifiedData[modifiedIndex++] = '5'; modifiedData[modifiedIndex++] = '1';
} else if (receivedData[i] == 'S') {modifiedData[modifiedIndex++] = '5'; modifiedData[modifiedIndex++] = '2';
} else if (receivedData[i] == 'T') {modifiedData[modifiedIndex++] = '5'; modifiedData[modifiedIndex++] = '3';
} else if (receivedData[i] == 'U') {modifiedData[modifiedIndex++] = '5'; modifiedData[modifiedIndex++] = '4';
} else if (receivedData[i] == 'V') {modifiedData[modifiedIndex++] = '5'; modifiedData[modifiedIndex++] = '5';
} else if (receivedData[i] == 'W') {modifiedData[modifiedIndex++] = '5'; modifiedData[modifiedIndex++] = '6';
} else if (receivedData[i] == 'X') {modifiedData[modifiedIndex++] = '5'; modifiedData[modifiedIndex++] = '7';
} else if (receivedData[i] == 'Y') {modifiedData[modifiedIndex++] = '5'; modifiedData[modifiedIndex++] = '8';
} else if (receivedData[i] == 'Z') {modifiedData[modifiedIndex++] = '5'; modifiedData[modifiedIndex++] = '9';
} else if (receivedData[i] == '[') {modifiedData[modifiedIndex++] = '6'; modifiedData[modifiedIndex++] = '0';
} else if (receivedData[i] == '\'') {modifiedData[modifiedIndex++] = '6'; modifiedData[modifiedIndex++] = '1';
} else if (receivedData[i] == ']') {modifiedData[modifiedIndex++] = '6'; modifiedData[modifiedIndex++] = '2';
} else if (receivedData[i] == '^') {modifiedData[modifiedIndex++] = '6'; modifiedData[modifiedIndex++] = '3';
} else if (receivedData[i] == '_') {modifiedData[modifiedIndex++] = '6'; modifiedData[modifiedIndex++] = '4';
} else if (receivedData[i] == '`') {modifiedData[modifiedIndex++] = '6'; modifiedData[modifiedIndex++] = '5';
} else if (receivedData[i] == 'a') {modifiedData[modifiedIndex++] = '6'; modifiedData[modifiedIndex++] = '6';
} else if (receivedData[i] == 'b') {modifiedData[modifiedIndex++] = '6'; modifiedData[modifiedIndex++] = '7';
} else if (receivedData[i] == 'c') {modifiedData[modifiedIndex++] = '6'; modifiedData[modifiedIndex++] = '8';
} else if (receivedData[i] == 'd') {modifiedData[modifiedIndex++] = '6'; modifiedData[modifiedIndex++] = '9';
} else if (receivedData[i] == 'e') {modifiedData[modifiedIndex++] = '7'; modifiedData[modifiedIndex++] = '0';
} else if (receivedData[i] == 'f') {modifiedData[modifiedIndex++] = '7'; modifiedData[modifiedIndex++] = '1';
} else if (receivedData[i] == 'g') {modifiedData[modifiedIndex++] = '7'; modifiedData[modifiedIndex++] = '2';
} else if (receivedData[i] == 'h') {modifiedData[modifiedIndex++] = '7'; modifiedData[modifiedIndex++] = '3';
} else if (receivedData[i] == 'i') {modifiedData[modifiedIndex++] = '7'; modifiedData[modifiedIndex++] = '4';
} else if (receivedData[i] == 'j') {modifiedData[modifiedIndex++] = '7'; modifiedData[modifiedIndex++] = '5';
} else if (receivedData[i] == 'k') {modifiedData[modifiedIndex++] = '7'; modifiedData[modifiedIndex++] = '6';
} else if (receivedData[i] == 'l') {modifiedData[modifiedIndex++] = '7'; modifiedData[modifiedIndex++] = '7';
} else if (receivedData[i] == 'm') {modifiedData[modifiedIndex++] = '7'; modifiedData[modifiedIndex++] = '8';
} else if (receivedData[i] == 'n') {modifiedData[modifiedIndex++] = '7'; modifiedData[modifiedIndex++] = '9';
} else if (receivedData[i] == 'o') {modifiedData[modifiedIndex++] = '8'; modifiedData[modifiedIndex++] = '0';
} else if (receivedData[i] == 'p') {modifiedData[modifiedIndex++] = '8'; modifiedData[modifiedIndex++] = '1';
} else if (receivedData[i] == 'q') {modifiedData[modifiedIndex++] = '8'; modifiedData[modifiedIndex++] = '2';
} else if (receivedData[i] == 'r') {modifiedData[modifiedIndex++] = '8'; modifiedData[modifiedIndex++] = '3';
} else if (receivedData[i] == 's') {modifiedData[modifiedIndex++] = '8'; modifiedData[modifiedIndex++] = '4';
} else if (receivedData[i] == 't') {modifiedData[modifiedIndex++] = '8'; modifiedData[modifiedIndex++] = '5';
} else if (receivedData[i] == 'u') {modifiedData[modifiedIndex++] = '8'; modifiedData[modifiedIndex++] = '6';
} else if (receivedData[i] == 'v') {modifiedData[modifiedIndex++] = '8'; modifiedData[modifiedIndex++] = '7';
} else if (receivedData[i] == 'w') {modifiedData[modifiedIndex++] = '8'; modifiedData[modifiedIndex++] = '8';
} else if (receivedData[i] == 'x') {modifiedData[modifiedIndex++] = '8'; modifiedData[modifiedIndex++] = '9';
} else if (receivedData[i] == 'y') {modifiedData[modifiedIndex++] = '9'; modifiedData[modifiedIndex++] = '0';
} else if (receivedData[i] == 'z') {modifiedData[modifiedIndex++] = '9'; modifiedData[modifiedIndex++] = '1';
} else if (receivedData[i] == '{') {modifiedData[modifiedIndex++] = '9'; modifiedData[modifiedIndex++] = '2';
} else if (receivedData[i] == '|') {modifiedData[modifiedIndex++] = '9'; modifiedData[modifiedIndex++] = '3';
} else if (receivedData[i] == '}') {modifiedData[modifiedIndex++] = '9'; modifiedData[modifiedIndex++] = '4';
} else if (receivedData[i] == '~') {modifiedData[modifiedIndex++] = '9'; modifiedData[modifiedIndex++] = '5';
} else if (receivedData[i] == '⌂') {modifiedData[modifiedIndex++] = '9'; modifiedData[modifiedIndex++] = '6';

Мне показалось, что только ща я вытащил рулон с принтера ЕС1046, и ща надо говно “ленту” в нем менять, надев перчатки))

Причем - у него отгорело заземление и он напечатал все наводки из сети питания.

Мы называли “простыней” что бумагу, что красящую ленту.

попадется вам устройство которое будет плеваться в вас цифрами, и ждать цифр в ответ, еще и молиться будите на этот рулон)))

ну раз спорить никто не хочет по поводу if… и ладно, берите сразу esp32 и работайте сразу с 2 ядрами, при чем даже через ардуино идэ можно … а то спорят тут… а о чем не понятно)))

А чо есп-то? Возьми вон кластер их ксеонов и работай на 10500 ядрах.

sadman41
https://aliexpress.ru/item/1005004605399313.html была инфа что возник крысис полупроводников, крысис закончился а цены остались теже… вы как хотите а я буду скупать esp32 для всего…

Токо не кури их, а то окончательно свихнёшся.