主要内容

避免生成代码中功能输入的数据副本

您可以通过编写使用与输入和输出相同的变量的函数来减少生成代码中的副本数量。例如:

功能a = foo(a,b)%#codegena = a * b;结尾

该编码实践使用参考参数优化。当变量同时充当输入和输出时,生成的代码通过引用传递变量,而不是将输入复制到临时变量。在前面的示例中,输入一个通过引用在生成的代码中传递,因为它也充当函数的输出foo

... / *函数定义 * / void foo(double *a,double b){ *a *= b;} ...

参考参数优化减少了内存使用时间和执行时间,尤其是当通过参考传递的变量是大数据结构时。要在呼叫站点上实现这些好处,请以与输入和输出相同的变量调用功能。

相比之下,假设您重写功能foo没有优化:

功能y = foo2(a,b)%#codegeny = a * b;结尾

生成的代码按值传递输入,并返回输出的值:

... / *函数定义 * / double foo2(double a,double b){返回a * b;} ...

在某些情况下,该函数的输出不能是其输入的修改版本。如果您以后不使用输入,则可以修改代码以在输入上操作,而不是在输入的副本上进行操作。一种方法是为该功能创建其他返回值。例如,考虑代码:

功能y1 = foo(u1)%#codegenx1 = u1+1;y1 = bar(x1);结尾功能y2 = bar(u2)%由于foo以后不使用x1,因此%进行此操作将是最佳的x2 = u2。*2;%在以下代码中的尺寸变化%意味着它不能做到到位y2 = [x2,x2];结尾

您可以修改代码以消除冗余副本。

功能y1 = foo(u1)%#codegenU1 = U1+1;[y1,u1] = bar(u1);结尾功能[y2,u2] = bar(u2)u2 = u2。*2;%在以下代码中的尺寸变化%仍然意味着它不能完成y2 = [u2,u2];结尾

参考参数优化不适用于常数输入。如果相同的变量是输入和输出,并且输入是恒定的,则代码生成器将输出视为单独的变量。例如,考虑功能foo

功能a = foo(a,b)%#codegena = a * b;结尾

生成代码一个具有恒定值2

代码根-config:libfoo-args{coder.constant(2)3}-报告

生成的代码定义常数一个并返回输出的值。

... #define a(2.0)... double foo(double b){返回a * b;} ...

相关话题