Этот пример показывает, как оптимизировать сгенерированный код путем объединения операторов if-else
, которые совместно используют то же условие. Эта оптимизация:
Улучшает поток управления.
Уменьшает размер кода.
Уменьшает потребление RAM.
Скорость выполнения увеличений.
Модель rtwdemo_controlflow_opt содержит три блока switch. Блок Constant предоставляет вход управления блокам switch. Переменная под названием Cond
определяет значение блока Constant.
model = 'rtwdemo_controlflow_opt';
open_system(model);
Создайте временную папку для сборки и инспекционного процесса.
currentDir = pwd; [~,cgDir] = rtwdemodir();
Создайте модель.
rtwbuild(model)
### Starting build procedure for model: rtwdemo_controlflow_opt ### Successful completion of build procedure for model: rtwdemo_controlflow_opt
Эти строки кода rtwdemo_controlflow_opt.c
показывают, что в сгенерированном коде, два оператора if-else
и один оператор else-if
представляют эти три блока switch.
cfile = fullfile(cgDir,'rtwdemo_controlflow_opt_ert_rtw',... 'rtwdemo_controlflow_opt.c'); rtwdemodbtype(cfile,'/* Model step', '/* Model initialize', 1, 0);
/* Model step function */ void rtwdemo_controlflow_opt_step(void) { /* Switch: '<Root>/Switch3' incorporates: * Constant: '<Root>/Const' * Switch: '<Root>/Switch2' */ if (Cond) { /* Switch: '<Root>/Switch1' */ if (Cond) { /* Outport: '<Root>/Out1' incorporates: * Inport: '<Root>/In1' */ rtY.Out1 = rtU.In1; } else { /* Outport: '<Root>/Out1' incorporates: * Inport: '<Root>/In2' */ rtY.Out1 = rtU.In2; } /* End of Switch: '<Root>/Switch1' */ } else if (Cond) { /* Switch: '<Root>/Switch2' incorporates: * Inport: '<Root>/In1' * Outport: '<Root>/Out1' */ rtY.Out1 = rtU.In1; } else { /* Outport: '<Root>/Out1' incorporates: * Inport: '<Root>/In2' */ rtY.Out1 = rtU.In2; } /* End of Switch: '<Root>/Switch3' */ }
Откройте диалоговое окно Configuration Parameters.
На Генерации кода-> панель Стиля кода, очистите выражение условия Заповедника в операторе if. Этот параметр включен по умолчанию.
Также используйте API командной строки, чтобы выключить параметр:
set_param(model, 'PreserveIfCondition', 'off');
В оптимизированном коде генератор кода консолидирует два оператора if-else
и один оператор else-if
в один оператор if-else
. Генератор кода консолидирует эти операторы, потому что они все совместно используют то же условие. Нет никакого прошедшего кода, который влияет на результаты этих операторов.
Создайте модель.
rtwbuild(model)
### Starting build procedure for model: rtwdemo_controlflow_opt ### Successful completion of build procedure for model: rtwdemo_controlflow_opt
Вот оптимизированный код rtwdemo_controlflow_opt.c
.
rtwdemodbtype(cfile,'/* Model step', '/* Model initialize', 1, 0);
/* Model step function */ void rtwdemo_controlflow_opt_step(void) { /* Switch: '<Root>/Switch1' incorporates: * Constant: '<Root>/Const' * Switch: '<Root>/Switch3' */ if (Cond) { /* Outport: '<Root>/Out1' incorporates: * Inport: '<Root>/In1' */ rtY.Out1 = rtU.In1; } else { /* Outport: '<Root>/Out1' incorporates: * Inport: '<Root>/In2' */ rtY.Out1 = rtU.In2; } /* End of Switch: '<Root>/Switch1' */ }
Закройте модель и вымойтесь.
bdclose(model) rtwdemoclean; cd(currentDir)
Сохраните выражение условия в операторе if