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

Reply via email to