Main Content

Analyze Code Execution Data

After a software-in-the-loop (SIL), processor-in-the-loop (PIL), or XCP-based external mode simulation, you can analyze execution-time data using methods from the coder.profile.ExecutionTime and coder.profile.ExecutionTimeSection classes.

  1. Open the model SILTopModel.

    openExample('ecoder/SILPILVerificationExample', ...
                 supportingFile='SILTopModel.slx')

  2. In the Mode section, select SIL/PIL Simulation Only.

  3. In the Settings gallery, specify options to enable profiling:

    • Under SIL/PIL Settings, click Portable Word Sizes on.

    • Under Time Profiling, click Task Profiling on, click Save Options to ALL DATA, and click Functions off.

    • Under Coverage, click Coverage Collection off.

  4. In the Run section, click Run SIL/PIL.

The software generates out, a Simulink.SimulationOutput object that contains executionProfile, a coder.profile.ExecutionTime object.

To get the total number of code sections that have profiling data, use the Sections method:

no_of_Sections = out.executionProfile.Sections
no_of_Sections = 

  1×2 ExecutionTimeTaskSection array with properties:

    Name
    Number
    ExecutionTimeInTicks
    SelfTimeInTicks
    TurnaroundTimeInTicks
    TotalExecutionTimeInTicks
    TotalSelfTimeInTicks
    TotalTurnaroundTimeInTicks
    MaximumExecutionTimeInTicks
    MaximumExecutionTimeCallNum
    MaximumSelfTimeInTicks
    MaximumSelfTimeCallNum
    MaximumTurnaroundTimeInTicks
    MaximumTurnaroundTimeCallNum
    NumCalls
    ExecutionTimeInSeconds
    Time
To get the coder.profile.ExecutionTimeSection object for a profiled code section, use the method Sections.
FirstSectionProfile = out.executionProfile.Sections(1)
SecondSectionProfile = out.executionProfile.Sections(2)
FirstSectionProfile = 

  ExecutionTimeTaskSection with properties:

                            Name: 'initialize'
                          Number: 1
            ExecutionTimeInTicks: 154
                 SelfTimeInTicks: 154
           TurnaroundTimeInTicks: 154
       TotalExecutionTimeInTicks: 154
            TotalSelfTimeInTicks: 154
      TotalTurnaroundTimeInTicks: 154
     MaximumExecutionTimeInTicks: 154
     MaximumExecutionTimeCallNum: 1
          MaximumSelfTimeInTicks: 154
          MaximumSelfTimeCallNum: 1
    MaximumTurnaroundTimeInTicks: 154
    MaximumTurnaroundTimeCallNum: 1
                        NumCalls: 1
          ExecutionTimeInSeconds: 4.2778e-08
                            Time: 0


SecondSectionProfile = 

  ExecutionTimeTaskSection with properties:

                            Name: 'step [0.1 0]'
                          Number: 2
            ExecutionTimeInTicks: [262 216 176 174 174 174 178 172 … ]
                 SelfTimeInTicks: [262 216 176 174 174 174 178 172 … ]
           TurnaroundTimeInTicks: [262 216 176 174 174 174 178 172 … ]
       TotalExecutionTimeInTicks: 22366
            TotalSelfTimeInTicks: 22366
      TotalTurnaroundTimeInTicks: 22366
     MaximumExecutionTimeInTicks: 748
     MaximumExecutionTimeCallNum: 68
          MaximumSelfTimeInTicks: 748
          MaximumSelfTimeCallNum: 68
    MaximumTurnaroundTimeInTicks: 748
    MaximumTurnaroundTimeCallNum: 68
                        NumCalls: 101
          ExecutionTimeInSeconds: [7.2778e-08 6.0000e-08 4.8889e-08 4.8333e-08 … ]
                            Time: [101×1 double]

Use coder.profile.ExecutionTimeSection methods to extract profiling information for a particular code section. For example, use Name to obtain the name of a profiled task.

name_of_section = SecondSectionProfile.Name
name_of_section =

    'step [0.1 0]'

If the timer is uncalibrated and you know the timer rate, for example 2.2 GHz, you can use the coder.profile.ExecutionTime method TimerTicksPerSecond to calibrate the timer.

out.executionProfile.TimerTicksPerSecond = 2.2e9;
SecondSectionProfile = out.executionProfile.Sections(2);

Related Topics