Оптимизируйте сгенерированный код путем консолидации избыточный если еще операторы

В этом примере показано, как оптимизировать сгенерированный код путем объединения if-else операторы, которые совместно используют то же условие. Эта оптимизация:

  • Улучшает поток управления.

  • Уменьшает размер кода.

  • Уменьшает потребление RAM.

  • Скорость выполнения увеличений.

Пример

Модель rtwdemo_controlflow_opt содержит три блока switch. Блок Constant предоставляет вход управления блокам switch. Переменная под названием Cond определяет значение блока Constant.

model = 'rtwdemo_controlflow_opt';
open_system(model);

Сгенерируйте код

Создайте временную папку для сборки и инспекционного процесса.

currentDir = pwd;
[~,cgDir] = rtwdemodir();

Создайте модель.

slbuild(model)
### Starting build procedure for: rtwdemo_controlflow_opt
### Successful completion of build procedure for: rtwdemo_controlflow_opt

Build Summary

Top model targets built:

Model                    Action                       Rebuild Reason                                    
========================================================================================================
rtwdemo_controlflow_opt  Code generated and compiled  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 9.6016s

Эти линии 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' */
}

Включите оптимизацию

  1. Откройте диалоговое окно Configuration Parameters.

  2. На Генерации кода-> панель Стиля кода, очистите выражение условия Заповедника в операторе if. Этот параметр включен по умолчанию.

В качестве альтернативы используйте API командной строки, чтобы выключить параметр:

set_param(model, 'PreserveIfCondition', 'off');

Сгенерируйте код с оптимизацией

В оптимизированном коде генератор кода консолидирует два if-else операторы и один else-if оператор в один if-else оператор. Генератор кода консолидирует эти операторы, потому что они все совместно используют то же условие. Нет никакого прошедшего кода, который влияет на результаты этих операторов.

Создайте модель.

slbuild(model)
### Starting build procedure for: rtwdemo_controlflow_opt
### Successful completion of build procedure for: rtwdemo_controlflow_opt

Build Summary

Top model targets built:

Model                    Action                       Rebuild Reason                   
=======================================================================================
rtwdemo_controlflow_opt  Code generated and compiled  Generated code was out of date.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 9.4425s

Вот 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)

Смотрите также

Похожие темы