Самый эффективный способ реализовать что-то вроде проверки нескольких уровней с учетом скорости выполнения - это сформировать «бинарный поиск» / BST из различных уровней.Что на практике означает написание цепочки if-else:
if(val < level_mid)
if(val < level_low)
// ...
else
// ...
else
if(val < level_high)
// ...
else
// ...
Вы не можете превзойти вышесказанное с точки зрения производительности и веток.С точки зрения читабельности / обслуживания оптимальный код будет выглядеть примерно так:
if(val < level_lowest)
// ...
else if(val < level_low)
// ...
else if(val < level_mid)
// ...
else if(val < level_high)
// ...
Этот код также довольно эффективен, но гораздо более читабелен / удобен в обслуживании, чем альтернатива "двоичного поиска".Как всегда, разберите и убедитесь сами.
Но, конечно, оптимизация кода вручную без учета конкретной системы не очень разумна.Предположим, например, что вы используете 8 или 16-битный процессор.Все, что будет иметь значение с точки зрения производительности в этом случае, - это размер целочисленных типов.Точно так же использование типов с плавающей запятой в MCU без FPU приведет к крайне неэффективному коду.
Если вы оптимизируете размер кода, вам следует обратить внимание на совершенно другие аспекты, чем количество ветвей.Избавление от раздутых библиотечных вызовов - вещь №1 (я смотрю на вас, stdio.h
).
Делать что-то вроде взятия абсолютных значений просто ради уменьшения размера кода бессмысленно - это не так.Совершенно очевидно, что это уменьшит размер кода.Что он, безусловно, сделает, так это увеличит сложность.Что, в свою очередь, приводит к увеличению кода и появлению новых ошибок.Примените принцип KISS .