I am working on a code base to solve a large dynamic economic model with heterogeneous agents.
I coded up two different iterative algorithms for solving the model. These are wrapped in functions that I’ll call
f2. These each make repeated calls to functions that carry out a single iteration step, call these
f1 looks somethign like:
function f1!(x,tol) while resid<tol xnew = g1(x) resid = abs(xnew - xold) @show resid x = xnew end end
f2 would have the same structure, but calling
g2 instead of
g2 inturn make calls to some shared helper functions (also to functions that are unique to each) but do not calls each other.
I’m finding that the execution speed of
f2 (and by extension
g2) is dramatically faster if I call if
g1 just once before executing
f2 performs many iteration, it seems unlikely that this would be a compile time issue; timing using
@time shows that compile time is minimal either when
g1 has been called first or otherwise.
I tried profiling the code and got quite strange results. Here is the profile for
g1 has been called first (using ProfileView.jl):
And here is the profile for
g1 was not called at all (i.e., start julia, then call only
The red areas in both profiles are “boot.jl, eval”, which from what I understand is to be expected given I was calling the functions from the REPL.
I don’t know what to make of the large white space to the left of the second flame chart. It almost looks like the first chart was simply squeezed to the right but a close inspection shows this is not exactly the case.
Grateful for any ideas anyone might have.