Чтобы улучшить скорость выполнения и использование памяти сгенерированного кода, MATLAB® Coder™ вводит следующую оптимизацию:
Когда возможно, генератор кода выполняет выражения в вашем коде MATLAB, которые включают константы времени компиляции только. В сгенерированном коде это заменяет эти выражения на результат оценок. Это поведение известно как сворачивание констант. Из-за сворачивания констант сгенерированный код не должен оценивать константы во время выполнения.
Следующий пример показывает код MATLAB, который постоянно свернут во время генерации кода. Функциональный MultiplyConstant
умножает каждый элемент в матрице скалярной константой. Функция оценивает это постоянное использование продукта трех констант времени компиляции, a
B
, и c
.
function out=MultiplyConstant(in) %#codegen a=pi^4; b=1/factorial(4); c=exp(-1); out=in.*(a*b*c); end
Генератор кода выполняет выражения, включающие константы времени компиляции, a
B
, и c
. Это заменяет эти выражения на результат оценки в сгенерированном коде.
Сворачивание констант может произойти, когда выражения включают скаляры только. Чтобы явным образом осуществить сворачивание констант выражений в других случаях, используйте coder.const
функция. Для получения дополнительной информации смотрите Вызовы функции Сгиба в Константы.
Можно управлять максимальным количеством инструкций, которые могут быть постоянно свернуты из командной строки или диалогового окна настроек проекта.
В командной строке создайте объект настройки для генерации кода. Установите свойство ConstantFoldingTimeout
к значению, которое вы хотите.
cfg=coder.config('lib');
cfg.ConstantFoldingTimeout = 200;
Используя приложение, в диалоговом окне настроек проекта, на вкладке All Settings, устанавливает поле Constant folding timeout на значение, которое вы хотите.
Когда возможно, генератор кода соединяется, последовательные циклы с тем же количеством сталкивается с одним циклом в сгенерированном коде. Эта оптимизация уменьшает цикл наверху.
Следующий код содержит последовательные циклы, которые сплавлены во время генерации кода. Функциональный SumAndProduct
оценивает сумму и продукт элементов в массиве Arr
. Функция использует два отдельных цикла, чтобы оценить сумму y_f_sum
и продукт y_f_prod
.
function [y_f_sum,y_f_prod] = SumAndProduct(Arr) %#codegen y_f_sum = 0; y_f_prod = 1; for i = 1:length(Arr) y_f_sum = y_f_sum+Arr(i); end for i = 1:length(Arr) y_f_prod = y_f_prod*Arr(i); end
Код, сгенерированный из этого кода MATLAB, оценивает сумму и продукт в одном цикле.
Когда возможно, генератор кода преобразует последовательные операции над матрицей в вашем коде MATLAB в одну операцию цикла в сгенерированном коде. Эта оптимизация уменьшает избыточный цикл, наверху вовлеченный в выполнение операций над матрицей в отдельных циклах.
Следующий пример содержит код, где последовательные операции над матрицей происходят. Функциональный ManipulateMatrix
умножает каждый элемент матричного Mat
с factor
. К каждому элементу в результате функция затем добавляет shift
:
function Res=ManipulateMatrix(Mat,factor,shift) Res=Mat*factor; Res=Res+shift; end
Сгенерированный код комбинирует умножение и сложение в одну операцию цикла.
Когда возможно, генератор кода подавляет генерацию кода из недостижимых процедур в вашем коде MATLAB. Например, если ветвь if, elseif, else
оператор недостижим, затем код не сгенерирован для той ветви.
Следующий пример содержит недостижимый код, который устраняется во время генерации кода. Функциональный SaturateValue
возвращает значение на основе области значений его входа x
.
function y_b = SaturateValue(x) %#codegen if x>0 y_b = x; elseif x>10 %This is redundant y_b = 10; else y_b = -x; end
Вторая ветвь if
, elseif
, else
оператор недостижим. Если переменная x
больше 10, это также больше 0. Поэтому первая ветвь выполняется в предпочтении к второй ветви.
MATLAB Coder не генерирует код для недостижимой второй ветви.
memcpy
ВызовыЧтобы оптимизировать сгенерированный код, который копирует последовательные элементы массива, генератор кода пытается заменить код на memcpy
вызвать. memcpy
вызов может быть более эффективным, чем код, таким как for
- цикл или несколько, последовательные присвоения элемента.
См. memcpy Оптимизацию.
memset
ВызовыЧтобы оптимизировать сгенерированный код, который присваивает литеральную константу последовательным элементам массива, генератор кода пытается заменить код на memset
вызвать. memset
вызов может быть более эффективным, чем код, таким как for
- цикл или несколько, последовательные присвоения элемента.
См. memset Оптимизацию.