Skip to content

time consuming function "addToResult!" #154

@johhell

Description

@johhell

test case

instModel.result.n_w_invariant = 149
instModel.nsegments = 1
length(instModel.x_start) = 17
number of result points = 5509

timing

... Timings for simulation of SMtest (without initialization):
 ─────────────────────────────────────────────────────────────────────────────────────────
                                                               Time          Allocations  
                                                         ───────────────   ───────────────
                     Total measured:                          2.50s            1.03GiB    

 Section                                         ncalls     time    %tot     alloc    %tot
 ─────────────────────────────────────────────────────────────────────────────────────────
 Modia.simulate!                                      1    2.40s   96.2%   0.98GiB   94.8%
 DifferentialEquations.solve                          1    2.40s   96.2%   0.98GiB   94.8%
 Modia getDerivatives!                            17.6k    2.38s   95.2%   1.03GiB   99.5%*
*Modia addToResult!                               5.51k    1.55s   62.0%   0.97GiB   93.9%   <<====
 Modia LinearEquationsIteration!                  87.8k    167ms    6.7%   4.02MiB    0.4%
 Modia.init!                                          1   95.6ms    3.8%   55.1MiB    5.2%
 Modia LinearEquationsIteration! (solve A*x=b)    52.7k   78.1ms    3.1%   4.02MiB    0.4%
 Modia eventIteration!                                1   91.5μs    0.0%   2.56KiB    0.0%
 DifferentialEquations.ODEProblem                     1   1.23μs    0.0%     0.00B    0.0%
 ─────────────────────────────────────────────────────────────────────────────────────────
  2.498988 seconds (2.94 M allocations: 1.034 GiB, 6.49% gc time)

modified addToResult!

function addToResult!(m::SimulationModel{FloatType,TimeType}, x, time, w_invariant...)::Nothing where {FloatType,TimeType}
the result of getDerivatives is called w_invariant and has the type Tuple, which is immutable. So it can be used directly (without deepcopy) in:

#     push!(result.w_invariant[end], deepcopy(w_invariant))
    push!(result.w_invariant[end], w_invariant)

timing with modified addToResult!

... Timings for simulation of SMtest (without initialization):
 ─────────────────────────────────────────────────────────────────────────────────────────
                                                               Time          Allocations  
                                                         ───────────────   ───────────────
                     Total measured:                          943ms            88.5MiB    

 Section                                         ncalls     time    %tot     alloc    %tot
 ─────────────────────────────────────────────────────────────────────────────────────────
 Modia getDerivatives!                            17.6k    859ms   91.2%   83.7MiB   94.6%
 Modia.simulate!                                      1    853ms   90.6%   33.4MiB   37.8%
 DifferentialEquations.solve                          1    853ms   90.5%   33.3MiB   37.6%
 Modia LinearEquationsIteration!                  87.8k    160ms   17.0%   4.02MiB    4.5%
 Modia.init!                                          1   88.8ms    9.4%   55.1MiB   62.2%
 Modia LinearEquationsIteration! (solve A*x=b)    52.7k   74.4ms    7.9%   4.02MiB    4.5%
*Modia addToResult!                               5.51k   65.5ms    6.9%   23.8MiB   26.9%   <<====
 Modia eventIteration!                                1   85.6μs    0.0%   2.56KiB    0.0%
 DifferentialEquations.ODEProblem                     1   1.30μs    0.0%     0.00B    0.0%
 ─────────────────────────────────────────────────────────────────────────────────────────
  0.944182 seconds (1.02 M allocations: 88.559 MiB)

time consumption and storage allocation was reduced dramatically

postscript

in previous Modia versions (<=0.8.4) the same approach was used.

function addToResult!(m::SimulationModel, variableValues...)::Nothing
    push!(m.result_vars , variableValues)
    push!(m.result_der_x, deepcopy(m.der_x))
    return nothing
end

used versions

Modia version = "0.9.4-dev"
Julia = 1.7.1

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions