您可以分析由MATLAB生成的MEX函数的执行时间®编码器™使用MATLAB Profiler。生成代码的概要文件显示了相应MATLAB函数的每一行调用的次数和花费的时间。使用Profiler来识别生成耗时最长的代码的MATLAB代码行。这些信息可以帮助您在开发周期的早期识别和纠正性能问题。有关MATLAB Profiler的更多信息,请参见配置文件
和配置您的代码以提高性能.
不支持剖析器的图形界面万博1manbetxMATLAB在线™.
您可以使用MATLAB Profiler生成一个MEX函数。或者,如果您有一个调用MATLAB函数的测试文件,那么您可以生成MEX函数并一次性分析它。您可以在命令行或MATLAB Coder应用程序中执行这些操作。
使用具有生成MEX功能的探查器:
通过设置配置对象属性来启用MEX分析EnableMexProfiming.
来真的
.
或者,您可以使用codegen
与之-轮廓
选项。
Matlab编码器应用程序中的等效设置是启用执行分析在里面生成的一步。
生成MEX文件MyFunction_mex
.
运行MATLAB Profiler并查看配置文件摘要报告,该报告将在单独的窗口中打开。
配置文件在;MyFunction_mex;配置文件观众;
确保您没有更改或移动原始MATLAB文件myfunction.m ..
.否则,Profiler不会考虑MyFunction_mex
用于分析。
如果您有测试文件MyFunctionTest.m
调用您的MATLAB功能,您可以:
通过使用,在一步中生成MEX函数并配置它codegen
与之以及
和-轮廓
选项。如果您之前打开了MATLAB Profiler,请在同时使用这两个选项之前将其关闭。
codegenmyfunction.以及MyFunctionTest-轮廓
通过选择来分析MEX函数启用执行分析在里面验证应用程序的步骤。如果您之前在Matlab Profiler上打开,请在执行此操作之前将其关闭。
您可以使用Profiler来标识生成时间最长的生成代码的MATLAB代码中的函数或行。下面是一个MATLAB函数的例子,转换其输入矩阵的表示一个
和B
从行主布局到列主布局。对于大矩阵,这样的转换执行时间很长。通过修改特定的行来避免转换,可以使函数更高效。
考虑matlab功能:
功能[y] = MyFunction (A, B)% # codegen生成的代码使用矩阵A和B的行主表示coder.rowMajor;长度=大小(1);通过遍历A和B的所有元素的绝对值%求和%矩阵行按行排sum_abs = 0;为行= 1:长度为col = 1:length sum_abs = sum_abs + abs(A(row,col)) + abs(B(row,col));结束结束%调用外部C函数'foo.c',返回所有元素的总和A和B的百分比总和= 0;sum = coder.ceval(“foo”coder.ref (A), coder.ref (B),长度);%返回sum_abs和sum的差异y = sum_abs - 总和;结束
生成的此函数的代码使用平方矩阵的行主要表示一个
和B
.代码首先进行计算SUM_ABS.
(所有元素的绝对值之和一个
和B
)通过逐行遍历矩阵。这个算法是优化的矩阵表示在行主布局。然后代码使用编码器.CEVAL.
调用外部C函数foo.c
:
#include#include #include "foo.h" double foo(double *A, double *B, double length) {int i,j,s;Double sum = 0;s = (int)长度;/*求和A和B的所有元素*/ for(i=0;i
对应的C头文件foo。
是:
#include "rtwtypes.h" double foo(double *A, double *B, double length);
foo.c
返回变量总和
的所有元素的总和一个
和B
.函数的性能foo.c
是否与矩阵无关一个
和B
以行为主或列为主的布局表示。myfunction.
返回差异SUM_ABS.
和总和
.
你可以衡量表现myfunction.
对于大输入矩阵一个
和B
,然后进一步优化:
启用MEX分析并生成MEX代码myfunction.
.跑MyFunction_mex
对于两个大的随机矩阵一个
和B
.查看个人资料摘要报告。
a = rand(20000);b =兰特(20000);codegenmyfunction.arg游戏{A、B}foo.cfoo。-轮廓配置文件在;myfunction_mex(a,b);配置文件观众;
打开一个单独的窗口,显示概要文件摘要报告。
Profile Summary Report显示了MEX文件及其子文件的总时间和自身时间,该子文件是为原始MATLAB函数生成的代码。
在“功能名称”下,单击第一个链接以查看生成的代码的配置文件详细信息报告myfunction.
.你可以看到花费时间最多的几行:
行调用编码器.CEVAL.
需要花费大量时间(16.914秒)。这条线具有相当大的执行时间,因为编码器.CEVAL.
转换矩阵的表示一个
和B
从行主布局到列主布局,然后将它们传递给外部C函数。您可以通过使用额外的参数来避免这种转换-layout:rowmajor.
在编码器.CEVAL.
:
sum = coder.ceval('-layout:rowmajor',“foo”coder.ref (A), coder.ref (B),长度);
使用修改后再次生成MEX函数和配置文件myfunction.
.
a = rand(20000);b =兰特(20000);codegenmyfunction.arg游戏{A、B}foo.cfoo。-轮廓配置文件在;myfunction_mex(a,b);配置文件观众;
myfunction.
显示线路呼叫编码器.CEVAL.
现在只需要0.653秒:
当你使用Coder.Const.
要将表达式折叠成常量,它会导致MATLAB函数与MEX函数之间的代码覆盖范围差异。例如,考虑该功能:
功能y = myfoldfunction.% # codegen= 1;b = 2;C = a + b;Y = 5 + code .const(c);结束
分析MATLAB功能myfoldfunction.
显示“配置文件详细信息报告”中的代码覆盖范围:
但是,分析MEX功能myfoldfunction_mex.
显示了不同的代码覆盖范围:
第2,3和4行未在生成的代码中执行,因为您已折叠表达式C = a + b
进入代码生成的常量。
此示例使用用户定义的表达式折叠。代码生成器有时会自动折叠某些表达式以优化生成的代码的性能。这种优化也导致MEX函数的覆盖范围与MATLAB函数不同。
codegen
|编码器.CEVAL.
|Coder.Const.
|Coder.mexcodeConfig
|coder.rowMajor
|配置文件