控制内联以微调生成代码的性能和可读性
内联是一种优化技术,它用函数的内容(主体)替换函数调用。内联消除了函数调用的开销,从而提高了速度。
根据你的应用程序,过多的代码内联也会有某些缺点:
内联会产生更大的C/ c++代码,降低代码的可读性。例如,假设您调用某个函数
喷火
在你的源MATLAB中做过很多次®代码。如果代码生成器总是内联喷火
,生成的代码大小增加,因为喷火
每次调用时都内联。然而,要实现这一点,调用站点必须不同。例如,如果内联不会导致较大的代码大小喷火
在循环中调用多次。对于出线函数,在函数返回时释放函数局部变量的堆栈空间。对于内联函数,即使在函数返回时,堆栈空间仍然被局部变量占用。因此,如果RAM或堆栈空间有限,可能需要限制函数内联。
代码生成器使用内部启发式来确定是否在生成的代码中内联函数。本帮助主题解释如何微调这些启发式方法,并生成满足应用程序的速度、可读性和堆栈空间要求的代码。
控件的内联MATLAB函数
要指示代码生成器始终或从不内联某个MATLAB函数,请使用coder.inline(总是)
而且coder.inline(“不”)
函数体内部的指令。要了解关于这些指令的更多信息,请参见coder.inline
.
通过使用代码生成设置控制内联
对于为您编写的函数生成的代码和为MathWorks生成的代码,您可能有不同的速度和可读性要求®功能。某些代码生成设置使您能够分别控制生成代码库的这两部分以及它们之间的边界的内联行为。这些设置适用于MEX和独立代码生成。
代码配置参数 | 描述 | 选项 |
---|---|---|
在代码配置对象中: 在MATLAB编码器™应用:所有设置选项卡,用户函数之间的内联 |
在编写的函数调用另一个函数的所有调用站点上控制内联行为 |
“总是” |“速度” (默认)|“可读性” |“永远” |
在代码配置对象中: 在MATLAB编码器应用:所有设置选项卡,MathWorks函数之间的内联 |
在MathWorks函数调用另一个MathWorks函数的所有调用站点上控制内联行为 |
“总是” |“速度” (默认)|“可读性” |“永远” |
在代码配置对象中: 在MATLAB编码器应用:所有设置选项卡,用户和MathWorks函数之间的内联 |
在您编写的函数调用MathWorks函数或MathWorks函数调用您编写的函数的所有调用站点上控制内联行为 |
“总是” |“速度” (默认)|“可读性” |“永远” |
选项的描述:
“总是”
:总是在调用站点执行内联。“速度”
:使用内部启发式来确定是否在调用站点执行内联。这种设置通常会导致高度优化的代码。此设置为默认设置。“可读性”
:几乎从不内联函数调用,除非调用非常小的函数。尽可能在不牺牲太多速度的情况下保持代码的模块化。产生高可读性的代码。“永远”
:从不内联函数调用。结果是最大的可读性。此设置可能会显著降低生成代码的性能。
请注意
在某些情况下,代码生成器可能不会严格遵循您为内联参数所选择的选项。例如,如果MathWorks函数体包含coder.inline(“不”)
指令,然后设置InlineBetweenMathWorksFunctions
来“总是”
时,代码生成器优先于coder.inline
指令,并且不内联该函数。有关更多信息,请参见不同内联控件之间的交互.
一个内联策略的例子
这是一个平衡生成代码的速度和可读性的内联策略示例。你指示代码生成器同时执行以下操作:
为了更好的可读性,在编写的代码中保持模块化,即使这会降低生成代码的速度。对于这个行为,集合
InlineBetweenUserFunctions
来“可读性”
.为MathWorks函数生成高度优化的代码,即使这会导致代码可读性较差,因为您不太可能检查代码库的这一部分。对于这个行为,集合
InlineBetweenMathWorksFunctions
来“速度”
.在生成的代码中,将您编写的函数和MathWorks函数分开,这样生成的代码看起来与您的MATLAB代码没有太大区别。对于这个行为,集合
InlineBetweenUserAndMathWorksFunctions
来“可读性”
.
不同内联控件之间的交互
的
coder.inline(总是)
或coder.inline(“不”)
指令将覆盖全局内联控件的效果,其中包括codegen
选项和代码配置设置。看到coder.inline
.的调用
coder.inline
指令,该指令影响这些函数与全局内联设置的交互方式。例如,如果MathWorks函数体包含coder.inline(“不”)
指令,然后设置InlineBetweenMathWorksFunctions
来“总是”
时,代码生成器优先于coder.inline
指令,并且不内联该函数。的
- o禁用:内联
而且o使:内联
选项的codegen
命令覆盖三个代码配置参数的个别值InlineBetweenUserFunctions
,InlineBetweenMathWorksFunctions
,InlineBetweenUserAndMathWorksFunctions
.
示例:在函数和MathWorks®函数之间的边界上控制内联
此示例演示如何控制在您编写的函数调用MathWorks函数或MathWorks函数调用您编写的函数的所有调用站点上的内联行为。
定义一个调用MathWorks函数的函数
定义一个MATLAB函数useBessely
它接受双数组x
作为输入,使用贝斯
函数,并返回具有相同类型和大小的数组x
.
类型useBessely.m
函数out = usebesily (x) out = x + besily (3,x);结束
生成带有默认内联设置的代码
类生成静态c++库useBessely
函数。指定输入为a1
——- - - - - -One hundred.
双
类型。内联设置使用默认值。这些默认值优化了生成代码的速度。使用- c
标志,指示代码生成器只生成源代码,而不构建源代码。
codegen- c朗:c++配置:自由useBesselyarg游戏{0 (1100)}报告
代码生成成功:要查看报告,请打开('codegen/lib/ usebesily /html/report.mldatx')
打开代码生成报告并检查生成的代码。注意,没有为MathWorks函数生成单独的c++函数贝斯
.类的代码已内联贝斯
函数转换为c++useBessely
函数,该函数包含在文件中useBessely.cpp
.
用修改过的内联设置生成代码
定义一个代码配置对象cfg
用于生成静态c++库。设置属性InlineBetweenUserAndMathWorksFunctions
来“永远”
.此设置指示代码生成器将您编写的函数与生成代码中的MathWorks函数分离开来。因此,生成的c++代码效率较低,但比内联代码更具可读性。
cfg = coder.config (“自由”);cfg。TargetLang =“c++”;cfg。InlineBetweenUserAndMathWorksFunctions =“永远”;
通过使用cfg
作为代码配置对象。指定输入为a1
——- - - - - -One hundred.
双
类型。使用- c
标志,指示代码生成器只生成源代码,而不构建源代码。
codegen- c配置cfguseBesselyarg游戏{0 (1100)}报告
代码生成成功:要查看报告,请打开('codegen/lib/ usebesily /html/report.mldatx')
打开代码生成报告并检查生成的代码。c++函数useBessely
现在调用另一个c++函数编码器:贝斯
其中包含为MathWorks函数生成的代码贝斯
.因此,生成的c++useBessely
函数看起来类似于MATLABuseBessely
你写的函数。
类型codegen / lib / useBessely / useBessely.cpp
// // File: usebesely .cpp // // MATLAB Coder版本:5.5 // C/ c++源代码生成于:8月31日2022 01:29:09 // // Include Files # Include " usebesely .h" # Include " besely .h" # Include "rt_nonfinite.h" //函数定义// //参数:const double x[100] // creal_T out[100] //返回类型:void // void usebesely (const double x[100], creal_T out[100]) {Coder:: besely (x, out);for (int i {0};我< 100;我+ +){[我]。再保险+ = x[我];}} // // usebesely .cpp的文件预告// // [EOF] //
另请参阅
coder.inline
|codegen
|编码器。CodeConfig
|编码器。EmbeddedCodeConfig
|编码器。MexCodeConfig