主要内容

控制内联以优化生成代码的性能和可读性

内联是一种优化技术,它用函数的内容(主体)替换函数调用。内联消除了函数调用的开销,从而提高了速度。

根据你的应用程序,过多的代码内联也有一定的缺点:

  • 内联可以生成更大的C/ c++代码,并降低代码的可读性。例如,假设您调用某个函数喷火在MATLAB源代码中做过很多次®代码。如果代码生成器总是内联喷火,生成的代码大小增加,因为喷火每次调用时都内联。但是,要做到这一点,调用站点必须不同。例如,如果内联不会导致大的代码大小喷火在循环中多次调用。

  • 对于行外函数,当函数返回时,释放函数本地变量的堆栈空间。对于内联函数,即使函数返回,堆栈空间仍然被局部变量占用。所以,如果你有有限的RAM或堆栈空间,你可能想要限制函数内联。

代码生成器使用内部启发式来确定是否在生成的代码中内联函数。本帮助主题解释如何微调这些启发式方法,并生成满足应用程序的速度、可读性和堆栈空间要求的代码。

特定控件的内联MATLAB函数

要指示代码生成器总是或从不内联某个MATLAB函数,请使用coder.inline(总是)而且coder.inline(“不”)该函数体中的指令。要了解有关这些指令的更多信息,请参见coder.inline

通过使用代码生成设置控制内联

对于为您编写的函数生成的代码和为MathWorks生成的代码,您可能有不同的速度和可读性要求®功能。某些代码生成设置使您能够单独控制所生成代码库的这两部分以及它们之间边界的内联行为。这些设置适用于MEX和独立代码生成。

代码配置参数 描述 选项

在代码配置对象中:InlineBetweenUserFunctions

MATLAB编码器™app:在所有设置选项卡,用户函数之间的内联

在您编写的函数调用另一个您编写的函数的所有调用站点上控制内联行为

“总是”|“速度”(默认)|“可读性”|“永远”

在代码配置对象中:InlineBetweenMathWorksFunctions

MATLAB编码器app:在所有设置选项卡,MathWorks函数之间的内联

在MathWorks函数调用另一个MathWorks函数的所有调用站点上控制内联行为

“总是”|“速度”(默认)|“可读性”|“永远”

在代码配置对象中:InlineBetweenUserAndMathWorksFunctions

MATLAB编码器app:在所有设置选项卡,用户和MathWorks函数之间的内联

在您编写的函数调用MathWorks函数或MathWorks函数调用您编写的函数的所有调用站点上控制内联行为

“总是”|“速度”(默认)|“可读性”|“永远”

选项的描述:

  • “总是”:始终在呼叫站点执行内联。

  • “速度”:使用内部启发式来确定是否在调用站点执行内联。这种设置通常会产生高度优化的代码。此设置为默认设置。

  • “可读性”:几乎从不内联函数调用,除非调用非常小的函数。尽可能在不牺牲太多速度的情况下保持代码的模块化。结果是高可读性的代码。

  • “永远”:从不内联函数调用。结果是最大的可读性。这种设置可能会显著降低生成代码的性能。

请注意

在某些情况下,代码生成器可能不会严格遵循您为内联参数选择的选项。例如,如果MathWorks函数体包含coder.inline(“不”)指令,你设置InlineBetweenMathWorksFunctions“总是”时,代码生成器优先选择coder.inline指令,并且不内联该函数。有关更多信息,请参见不同内联控件之间的交互

一个内联策略的例子

这是一个内联策略的例子,它平衡了生成代码的速度和可读性。您指示代码生成器同时执行以下操作:

  • 在您编写的代码中保留模块化以获得更好的可读性,即使这会降低生成代码的速度。对于这种行为,setInlineBetweenUserFunctions“可读性”

  • 为MathWorks函数生成高度优化的代码,即使这会导致代码可读性较差,因为您不太可能检查代码库的这一部分。对于这种行为,setInlineBetweenMathWorksFunctions“速度”

  • 在生成的代码中,将您编写的函数和MathWorks函数分开,以便生成的代码看起来与MATLAB代码没有太大区别。对于这种行为,setInlineBetweenUserAndMathWorksFunctions“可读性”

不同内联控件之间的交互

  • coder.inline(总是)coder.inline(“不”)指令放在MATLAB函数体中的指令将覆盖全局内联控件的效果,包括codegen选项和代码配置设置。看到coder.inline

    某些MathWorks函数包括对coder.inline指令,该指令影响这些函数如何与全局内联设置交互。例如,如果MathWorks函数体包含coder.inline(“不”)指令,你设置InlineBetweenMathWorksFunctions“总是”时,代码生成器优先选择coder.inline指令,并且不内联该函数。

  • - o禁用:内联而且o使:内联的选项codegen命令覆盖三个代码配置参数的单独值InlineBetweenUserFunctionsInlineBetweenMathWorksFunctions,InlineBetweenUserAndMathWorksFunctions

示例:在函数和MathWorks®函数之间的边界处控制内联

此示例展示了如何在您编写的函数调用MathWorks函数或MathWorks函数调用您编写的函数的所有调用站点控制内联行为。

定义一个调用MathWorks函数的函数

定义一个MATLAB函数useBessely它接受双数组x类型处理输入数组贝斯函数,并返回一个类型和大小与x

类型useBessely.m
函数out = useBessely(x) out = x + bessely(3,x);结束

使用默认内联设置生成代码

类的静态c++库useBessely函数。指定输入为a1——- - - - - -One hundred.类型。使用内联设置的默认值。这些默认值优化了生成代码的速度。使用- c标志,指示代码生成器只生成源代码而不构建源代码。

codegen- c朗:c++配置:自由useBesselyarg游戏{0 (1100)}报告
要查看报告,打开('codegen/lib/useBessely/html/report.mldatx')

打开代码生成报告并检查生成的代码。请注意,没有为MathWorks函数生成单独的c++函数贝斯.类的代码已内联贝斯函数导入c++useBessely文件中包含的函数useBessely.cpp

用修改过的内联设置生成代码

定义一个代码配置对象cfg用于生成静态c++库。设置属性InlineBetweenUserAndMathWorksFunctions“永远”.此设置指示代码生成器在生成的代码中分离您编写的函数和MathWorks函数。因此,生成的c++代码效率较低,但比内联代码可读性更好。

CFG = code .config(“自由”);cfg。TargetLang =“c++”;cfg。InlineBetweenUserAndMathWorksFunctions =“永远”

使用以下命令生成代码cfg作为代码配置对象。指定输入为a1——- - - - - -One hundred.类型。使用- c标志,指示代码生成器只生成源代码而不构建源代码。

codegen- c配置cfguseBesselyarg游戏{0 (1100)}报告
要查看报告,打开('codegen/lib/useBessely/html/report.mldatx')

打开代码生成报告并检查生成的代码。c++函数useBessely现在调用另一个c++函数编码器:贝斯其中包含为MathWorks函数生成的代码贝斯.因此,生成的c++useBessely函数看起来类似于MATLABuseBessely你写的函数。

类型codegen / lib / useBessely / useBessely.cpp
// //文件:useBessely.cpp // // MATLAB Coder版本:5.3 // C/ c++源代码生成于:2021年10月23日05:40:19 // // Include Files # Include "useBessely.h" # Include "bessely.h" # Include "rt_nonfinite.h" //函数定义// //参数:const double x[100] // creal_T out[100] //返回类型:void // void useBessely(const double x[100], creal_T out[100]) {Coder::bessely(x, out);For (int i{0};I < 100;I ++) {out[I]。Re += x[i];}} // // useBessely.cpp的文件预告片// // [EOF] //

另请参阅

||||

相关的话题