While optimizing some ODE code, I noticed that +=
on Ref{Float64}
allocates, while .+=
on a vector slice doen’t. Why is that?
I wasn’t able to reproduce the effect without DifferentialEquations
, but I feel like it should be possible.
In practice I’m using Params
for preallocation. Is that the correct design decision?
using Revise
using DifferentialEquations
struct Params
x::Ref{Float64}
end
Params() = Params(0.0)
function f!(du::Vector{Float64}, u::Vector{Float64}, p::Params, t::Float64)
p.x[] += 1.0 # 3168 bytes allocated
du[1] = -u[1]
end
function run()
u0 = [1.0]
tspan = (0.0, 1.0)
p = Params(0.0)
ode_problem = ODEProblem(f!, u0, tspan, p)
_ = solve(ode_problem, Tsit5(), reltol=1e-8, abstol=1e-8)
println(p)
end
run()