主要内容

MATLAB编码器在生成的代码优化

改善的执行速度和内存使用生成的代码,MATLAB®编码器™介绍了以下优化:

常数合并

在可能的情况下,代码生成器计算表达式在MATLAB代码中只涉及到编译时常量。在生成的代码中,它取代这些表达式的结果评估。这种行为被称为常数合并。由于常数合并,生成的代码没有在执行评估常量。

下面的例子展示了MATLAB代码constant-folded在代码生成。这个函数MultiplyConstant增加一个矩阵的每个元素一个标量常数。函数评估这个常数使用该产品的三个编译时常量,一个,b,c

函数= MultiplyConstant(中)% # codegen一个=π^ 4;b = 1 /阶乘(4);c = exp (1);出=。* (a * b * c);结束

代码生成器评估涉及编译时常量表达式,一个,b,c。它取代这些表达式与评估的结果生成的代码。

常数合并只能发生在当表达式包括标量。明确执行常数合并的表达式在其他情况下,使用coder.const函数。有关更多信息,请参见函数调用折叠成常量

控制常数合并

你可以控制指令的最大数量,可以从命令行constant-folded或“项目设置”对话框中。

  • 在命令行,创建一个配置对象的代码生成。设置属性ConstantFoldingTimeout你想要的价值。

    cfg = coder.config (“自由”);cfg。ConstantFoldingTimeout = 200;
  • 使用应用程序,在“项目设置”对话框中所有设置选项卡,设置字段常数合并超时你想要的价值。

循环融合

在可能的情况下,代码生成器融合与相同数量的连续循环运行到一个循环在生成的代码中。这种优化减少循环开销。

下面的代码包含连续循环,融合在代码生成。这个函数SumAndProduct计算数组中元素的总和和产品加勒比海盗。函数使用两个独立的循环评估之和y_f_sum和产品y_f_prod

函数[y_f_sum, y_f_prod] = SumAndProduct (Arr)% # codegeny_f_sum = 0;y_f_prod = 1;i = 1:长度(Arr) y_f_sum = y_f_sum + Arr(我);结束i = 1:长度(Arr) y_f_prod = y_f_prod * Arr(我);结束

生成的代码从这个评估和MATLAB代码和产品在一个循环。

连续的矩阵运算相结合

在可能的情况下,代码生成器将连续的矩阵运算在MATLAB代码转换成一个循环操作生成的代码。这种优化减少了多余的循环开销参与执行矩阵操作在不同的循环。

下面的示例代码包含连续的矩阵运算。这个函数摆弄矩阵增加一个矩阵的每个元素与一个因素。在结果中每一个元素,然后添加一个函数转变:

函数Res =摆弄矩阵(垫,因素,转变)Res =垫*因素;Res = Res +转变;结束

生成的代码结合了乘法和加法成一个循环操作。

遥不可及的代码消除

在可能的情况下,代码生成器抑制从遥不可及的MATLAB代码程序代码生成。例如,如果一个的一个分支elseif,如果别的声明是遥不可及的,那么代码不是生成的分支。

下面的示例包含的代码,这是消除在代码生成。这个函数SaturateValue返回一个值根据其输入的范围x

函数y_b = SaturateValue (x)% # codegen如果> 0 y_b = x;elseifx > 10%这是多余的y_b = 10;其他的y_b = - x;结束

第二个分支如果,elseif,其他的声明是遥不可及的。如果变量x大于10,也大于0。因此,第一个分支是优先于第二个分支执行。

MATLAB编码器遥不可及的第二支行不生成代码。

memcpy调用

连续复制数组元素的优化生成的代码,代码生成器试图替换的代码memcpy调用。一个memcpy电话可以比代码更高效,例如连续循环或多个元素赋值。

看到memcpy优化

memset调用

生成的代码优化连续文字常量赋值给数组元素,代码生成器试图替换的代码memset调用。一个memset电话可以比代码更高效,例如连续循环或多个元素赋值。

看到memset优化