Keep the type annotations in the EulerSolver type declaration, but get rid of
all of them in your functions. Then read
http://docs.julialang.org/en/release-0.3/manual/performance-tips/,
try the profiler (use ProfileView.jl to inspect the results), and see if you
can
figure out what's wrong. (Bottom line is you likely have a type-instability.)
Best,
--Tim
On Saturday, April 25, 2015 04:58:49 PM François Fayard wrote:
> Hi,
>
> Here is a first shot at the program (My first Julia program). It seems that
> I don't get good performance (46% of time spent in gc). What is the reason
> for that?
>
> type EulerSolver
> f::Function
> t0::Float64
> y0::Vector{Float64}
> delta_t::Float64
> delta_t_save::Float64
> t_right::Vector{Float64}
> y_right::Vector{Vector{Float64}}
> t_left::Vector{Float64}
> y_left::Vector{Vector{Float64}}
> end
>
> function ode_solver(f, t0::Float64, y0::Vector{Float64}, delta_t::Float64,
> delta_t_save::Float64)
> solver = EulerSolver(f, t0, y0, delta_t, delta_t_save, [], [], [], [])
> return solver
> end
>
> function evaluate(solver::EulerSolver, t_final::Float64)
> t::Float64
> y::Vector{Float64}
> if length(solver.t_right) > 0
> if t_final >= solver.t_right[length(solver.t_right)]
> t = solver.t_right[length(solver.t_right)]
> y = solver.y_right[length(solver.y_right)]
> elseif t_final < solver.t_right[1]
> t = solver.t0
> y = solver.y0
> else
> k = 1
> while t >= solver.t_right[k]
> k += 1
> end
> t = solver.t_right[k]
> y = solver.y_right[k]
> end
> else
> t = solver.t0
> y = solver.y0
> end
>
> last_t_saved::Float64 = t
> delta_t::Float64 = solver.delta_t
> dy_dt::Vector{Float64} = zeros(y)
>
> is_finished::Bool = false
> while !is_finished
> if t + delta_t > t_final
> delta_t = t_final - t
> is_finished = true
> end
>
> f!(dy_dt, t, y)
> for k = 1:length(y)
> y[k] = y[k] + delta_t * dy_dt[k]
> end
> t = t + delta_t
>
> if abs(t - last_t_saved) >= solver.delta_t_save
> println("Save")
> last_t_saved = t
> push!(solver.t_right, t)
> push!(solver.y_right, deepcopy(y))
> end
> end
>
> return y
> end
>
> function f!(dy_dt::Vector{Float64}, t::Float64, y::Vector{Float64})
> dy_dt[1] = y[1]
> end
>
> t0 = 0.0
> y0 = [ 1.0 ]
> delta_t = 1.0e-8
> delta_t_save = 1.0
>
> solver = ode_solver(f!, t0, y0, delta_t, delta_t_save)
> @time println(evaluate(solver, 3.12))