This is also covered in the performance tips, but two points you should keep in
mind:
- put const in front of all globals
- run the function you want to time once before timing otherwise you will
measure (mainly) compilation time
- just as a remark: instead of t_right[length(t_right)] you can just write
t_right[end]
Best,
Alex.
On Sunday, 26 April 2015 01:58:49 UTC+2, 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))