主要内容

控制内联微调性能和生成的代码的可读性

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

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

  • 内联可以产生更大的C / c++代码,减少代码的可读性。例如,假设你调用一个函数喷火很多次在你的MATLAB源®代码。如果总是内联代码生成器喷火因为,生成的代码大小的增加喷火每次都是内联调用它。然而,要实现这一目标,调用网站必须是不同的。例如,如果内联不会导致大型代码大小喷火叫几次在一个循环。

  • 超行功能,堆栈空间函数中的局部变量是函数返回时释放。内联函数的堆栈空间,仍然被局部变量即使函数返回。所以,如果你RAM或堆栈空间有限,您可能希望限制内联函数。

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

控制一个特定的内联MATLAB函数

指导代码生成器总是或从未内联某个MATLAB函数,使用coder.inline(总是)coder.inline(“不”)指令在体内的功能。了解更多关于这些指令,明白了coder.inline

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

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

代码配置参数 描述 选项

在一个代码配置对象:InlineBetweenUserFunctions

MATLAB编码器™应用:所有设置选项卡,内联之间用户功能

控制内联行为调用站点,你写一个函数,调用另一个函数,你写道

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

在一个代码配置对象:InlineBetweenMathWorksFunctions

MATLAB编码器应用:所有设置选项卡,内联MathWorks功能之间

控制内联行为调用地点MathWorks函数调用另一个MathWorks函数

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

在一个代码配置对象:InlineBetweenUserAndMathWorksFunctions

MATLAB编码器应用:所有设置选项卡,内联和用户之间MathWorks功能

控制内联行为调用站点,你写一个函数,调用一个MathWorks函数,或者MathWorks函数调用一个函数,你写道

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

选项的描述:

  • “总是”:总是执行内联调用站点。

  • “速度”:使用内部启发式来决定是否执行内联调用站点。这个设置通常会导致高度优化的代码。这个设置是默认设置。

  • “可读性”:几乎从不内联函数调用,除了要求非常小的功能。保留了模块化的代码不牺牲太多的速度,只要有可能。结果在高度可读的代码。

  • “永远”:永远不要内联函数调用。导致最大的可读性。这个设置可以显著减少生成的代码的性能。

请注意

在某些情况下,代码生成器可能无法严格按照您选择的选项的内联参数。例如,如果MathWorks函数包含的身体coder.inline(“不”)指令和设置InlineBetweenMathWorksFunctions“总是”,代码生成器为优先coder.inline指令,不内联函数。有关更多信息,请参见不同的内联控件之间的相互作用

一个例子内联策略

这是一个内联战略,平衡速度和生成的代码的可读性。同时您指示代码生成器来执行这些操作:

  • 保持你写的代码的模块化更好的可读性,即使这样会减少生成的代码的速度。对于这种行为,集InlineBetweenUserFunctions“可读性”

  • 为MathWorks函数生成高度优化的代码,即使这结果在可读的代码,因为您不太可能检查这部分代码的基础。对于这种行为,集InlineBetweenMathWorksFunctions“速度”

  • 在生成的代码中,单独的函数编写和MathWorks功能,这样生成的代码与MATLAB代码看起来并没有多大的不同。对于这种行为,集InlineBetweenUserAndMathWorksFunctions“可读性”

不同的内联控件之间的相互作用

  • coder.inline(总是)coder.inline(“不”)指令将体内的MATLAB函数覆盖全球内联控制的影响,包括codegen选择和配置设置的代码。看到coder.inline

    某些MathWorks功能包括一个调用coder.inline影响这些功能如何与全球交互指令内联设置。例如,如果MathWorks函数包含的身体coder.inline(“不”)指令和设置InlineBetweenMathWorksFunctions“总是”,代码生成器为优先coder.inline指令,不内联函数。

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

例如:控制内联函数之间的边界和MathWorks®功能

这个例子展示了如何控制内联行为调用站点,你写一个函数,调用一个MathWorks函数,或者MathWorks函数调用一个函数,你写道。

定义一个函数调用MathWorks功能

定义一个MATLAB函数useBessely接受一个数组的两倍x作为输入、过程输入阵列使用贝斯函数,返回一个数组具有相同的类型和大小x

类型useBessely.m
函数从= useBessely (x) = x +贝斯(x);结束

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

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

codegen- c朗:c++配置:自由useBesselyarg游戏{0 (1100)}报告
代码生成成功:查看报告,打开(“codegen / lib / useBessely / html / report.mldatx”)

打开代码生成报告和检查生成的代码。注意到,没有单独的c++函数生成的MathWorks函数贝斯。代码生成器内联的代码贝斯到c++函数useBessely函数包含在文件中useBessely.cpp

生成代码内联的设置与修改

定义一个配置对象的代码cfg生成一个静态c++库。设置属性InlineBetweenUserAndMathWorksFunctions“永远”。此设置指示代码生成器将你写的功能和MathWorks功能生成的代码。结果,生成c++代码效率较低,但比内联代码可读性更强。

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

通过使用生成代码cfg作为配置对象的代码。指定的输入是一个1——- - - - - -One hundred.类型。使用- c标志,指示代码生成器产生源代码只而不是构建源代码。

codegen- c配置cfguseBesselyarg游戏{0 (1100)}报告
代码生成成功:查看报告,打开(“codegen / lib / useBessely / html / report.mldatx”)

打开代码生成报告和检查生成的代码。c++函数useBessely现在调用另一个c++函数编码器:贝斯包含MathWorks函数所生成的代码贝斯。作为一个要求时,生成的C + +useBessely类似于MATLAB函数useBessely你写的函数。

类型codegen / lib / useBessely / useBessely.cpp
/ / / /文件:useBessely。cpp / / / / MATLAB编码器版本:5.6 / / C / c++源代码生成:03 - mar - 2023 05:02:50 / / / / #包括“useBessely包括文件。h“# include”贝斯。h rt_nonfinite # include。h”/ / / / / /函数定义参数:const双x [100] / / creal_T[100] / /返回类型:空白/ /空白useBessely (const双x [100], [100] creal_T){编码器:贝斯(x);for (int i {0};我< 100;我+ +){[我]。再保险+ = x[我];}}/ / / /文件useBessely拖车。cpp / / / / / / (EOF)

另请参阅

||||

相关的话题