比较性能
当仿真执行时间超出代码生成所需的时间时,与普通模式相比,加速和快速加速仿真模式可以提高速度。当仿真执行时间为几分钟或更长时,加速和快速加速模式的执行性能一般要高于普通模式。但是,包含大量 Stateflow® 或 MATLAB Function 模块的模型在速度提升方面可能只是略高于普通模式,因为这些模块在普通模式下也通过代码生成进行仿真。
在模型中包含可调参数也会增加仿真时间。
该图显示一个假设模型一般情况下在普通模式、加速模式和快速加速模式下仿真的相对性能。
必须重新编译目标时的性能
图中的实线(标签为 all targets out of date)表示必须重新编译目标代码时的性能。对于这个假设的模型,时间大约为几分钟。但对于复杂模型,时间可能会更长。
在普通模式下编译模型通常比编译加速目标或快速加速可执行文件需要更少的时间。对于较小的仿真停止时间,普通模式下的整体仿真比加速模式和快速加速模式都要快。
加速模式或快速加速模式出现更快的整体仿真的交叉点取决于模型的复杂度和内容。例如,如果模型包含大量使用解释代码的模块,则在加速模式下的运行速度可能并不比普通模式下快很多,除非仿真停止时间非常长。有关详细信息,请参阅为加速模式选择模块。同样,如果模型中包含大量 Stateflow 图或 MATLAB Function 模块,速度提升也未必比在普通模式下高很多,除非仿真停止时间很长。您可以通过代码生成来加速具有 Stateflow 或 MATLAB Function 模块的模型的仿真。
该图显示一个具有大量 Stateflow 图或 MATLAB Function 模块的模型。如果模型中不包含这些模块,标记为 Normal 的曲线的初始已用时间应该比图中显示的更小。
目标最新时的性能
图中标签为 all targets up to date 的虚线显示,确定加速目标或快速加速可执行文件是否为最新的时间远远少于生成代码所需的时间,后者由标签为 all targets out of date 的实线表示。当您想要测试各种设计权衡时,您可以利用此特性。
例如,您可以为加速模式生成一次目标,然后基于这些代码,使用一系列增益设置对您的模型进行仿真。此方法对于加速或快速加速模式特别高效,因为这种类型的更改不会导致重新生成目标代码。模型只在第一次运行时生成目标代码,后续运行时,软件只需花时间验证目标是否最新。此过程远比生成代码更快,因此后续运行可能比第一次运行快得多。
因为检查目标要比生成代码更快,所以当目标已经是最新版本时,交叉点要比必须生成代码时更小。对于模型后续运行的仿真,加速或快速加速模式要比普通模式更快,即使停止时间较短也是如此。
分析仿真模式的性能
此示例通过运行三个仿真来比较模型 sldemo_fuelsys
的正常和快速加速器模式仿真的性能:
第一次仿真采用正常模式。
第二次仿真采用快速加速器模式,建立快速加速器目标。
第三次仿真采用快速加速器模式,不构建快速加速器目标。
要分析每个仿真的性能,请检查仿真元数据返回的时间信息。仿真元数据作为 Simulink.SimulationOutput
对象的 SimulationMetadata
属性中的 Simulink.SimulationMetadata
对象返回。Simulink.SimulationMetadata
对象的 TimingInfo
属性提供了总仿真时间以及仿真每个阶段所花费时间的细目分类。
打开模型。
mdl = "sldemo_fuelsys";
要配置基线正常模式仿真,请创建一个 Simulink.SimulationInput
对象。SimulationInput
对象存储在仿真中使用的参数值。对象上的参数值应用于仿真,并在仿真结束时还原,以便模型保持不变。
simin = Simulink.SimulationInput(mdl);
将停止时间设置为 10000
。将仿真模式设置为 Normal
。
simin = setModelParameter(simin,"StopTime","10000"); simin = setModelParameter(simin,"SimulationMode","normal");
要捕获基线计时信息,请仿真模型。
simOut = sim(simin);
仿真以单个 Simulink.SimulationOutput
对象的形式返回结果。SimulationMetadata
属性包含仿真元数据,存储为 Simulink.SimulationMetadata
对象。
使用圆点表示法将 TimingInfo
属性的内容存储在名为 normalMode
的变量中。
normalMode = simOut.SimulationMetadata.TimingInfo;
从计时信息中,提取仿真的初始化时间、执行时间和总历时。
normalInit = normalMode.InitializationElapsedWallTime; normalExec = normalMode.ExecutionElapsedWallTime; normalTotal = normalMode.TotalElapsedWallTime;
使用快速加速模式再次仿真该模型。首次在快速加速模式下仿真模型时,会在初始化阶段编译快速加速目标。
simin = setModelParameter(simin,"SimulationMode","rapid"); simOut = sim(simin);
### Searching for referenced models in model 'sldemo_fuelsys'. ### Total of 1 models to build. ### Building the rapid accelerator target for model: sldemo_fuelsys ### Successfully built the rapid accelerator target for model: sldemo_fuelsys
获取第一个快速加速器仿真的时间信息。然后,提取仿真的初始化时间、执行时间和总历时。
rapidAccel = simOut.SimulationMetadata.TimingInfo; rapidBuildInit = rapidAccel.InitializationElapsedWallTime; rapidBuildExec = rapidAccel.ExecutionElapsedWallTime; rapidBuildTotal = rapidAccel.TotalElapsedWallTime;
再次仿真,以查看不编译快速加速目标对于快速加速模式的仿真有哪些好处。
simOut = sim(simin);
### Searching for referenced models in model 'sldemo_fuelsys'. ### Total of 1 models to build.
获取未构建目标而运行的快速加速器仿真的时间信息。然后,提取仿真的初始化时间、执行时间和总历时。
rapidAccelNoRebuild = simOut.SimulationMetadata.TimingInfo; rapidInit = rapidAccelNoRebuild.InitializationElapsedWallTime; rapidExec = rapidAccelNoRebuild.ExecutionElapsedWallTime; rapidTotal = rapidAccelNoRebuild.TotalElapsedWallTime;
创建一个表来比较每次仿真的时间。
Normal = [normalInit;normalExec;normalTotal]; RapidBuild = [rapidBuildInit;rapidBuildExec;rapidBuildTotal]; RapidNoBuild = [rapidInit;rapidExec;rapidTotal]; names = ["Initialization Time"; "Execution Time"; "Total Simulation Time"]; timingTable = table(Normal,RapidBuild,RapidNoBuild,RowNames=names);
在第一次快速加速仿真中,初始化时间增加,因为快速加速目标在初始化阶段进行编译。对于此模型和仿真持续时间,使用快速加速模式可以大大减少执行时间,因此第一次快速加速仿真仍比使用普通模式要快。
timingTable
timingTable=3×3 table
Normal RapidBuild RapidNoBuild
______ __________ ____________
Initialization Time 9.1109 24.371 2.1894
Execution Time 121.25 52.275 40.829
Total Simulation Time 130.4 76.751 43.115
另请参阅
Simulink.SimulationInput
| Simulink.SimulationOutput