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))

Reply via email to