Для повышения скорости выполнения и использования памяти генерируемого кода 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;С помощью приложения в диалоговом окне «Параметры проекта» на вкладке «Все параметры» установите в поле «Время ожидания сворачивания константы» нужное значение.
Когда это возможно, генератор кода сплавляет последовательные циклы с таким же количеством циклов в один цикл в сгенерированном коде. Такая оптимизация позволяет сократить издержки, связанные с контурами.
Следующий код содержит последовательные циклы, которые плавятся во время генерации кода. Функция 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 не генерирует код для недоступной второй ветви.
memcpy ТребованияЧтобы оптимизировать сгенерированный код, копирующий последовательные элементы массива, генератор кода пытается заменить код на memcpy звоните. A memcpy вызов может быть более эффективным, чем код, например for-закольцовывание или несколько последовательных назначений элементов.
См. раздел Оптимизация memcpy.
memset ТребованияЧтобы оптимизировать сгенерированный код, который присваивает литеральную константу последовательным элементам массива, генератор кода пытается заменить код на memset звоните. A memset вызов может быть более эффективным, чем код, например for-закольцовывание или несколько последовательных назначений элементов.
См. раздел Оптимизация memset.