# Background

In Gridap.jl, we have experienced a significant increase in compile times when moving from Julia 1.5 to Julia 1.6. To illustrate this, consider this example:

``````using Gridap
function  main()
domain = (0,1,0,1,0,1); cells = (3,3,3); k = 2
γ = 10; h = 1/3
model = simplexify(CartesianDiscreteModel(domain,cells))
reffe = ReferenceFE(lagrangian,Float64,k)
V = TestFESpace(model,reffe,dirichlet_tags="boundary")
U = TrialFESpace(V)
Ω = Triangulation(model)
Γ = BoundaryTriangulation(model)
Λ = SkeletonTriangulation(model)
dΩ = Measure(Ω,2*k)
dΓ = Measure(Γ,2*k)
dΛ = Measure(Λ,2*k)
n_Γ = get_normal_vector(Γ)
n_Λ = get_normal_vector(Λ)
a(u,v) = ∫( ∇(v)⋅∇(u) )dΩ +
∫( (γ/h)*v*u  - v*(n_Γ⋅∇(u)) - (n_Γ⋅∇(v))*u )dΓ +
∫( (γ/h)*jump(v*n_Λ)⋅jump(u*n_Λ) -
jump(v*n_Λ)⋅mean(∇(u)) -
mean(∇(v))⋅jump(u*n_Λ) )dΛ
l(v) = ∫( v )dΩ
op = AffineFEOperator(a,l,U,V)
uh = solve(op)
end
``````

Calling

``````@time main()
``````

takes 92.353941 (Julia 1.5) vs 221.752225 (Julia 1.6) in a fresh session. So 2.4x increase. This is a major problem for us since 92 seconds was already a long compilation time.

I believe that Julia (i.e. inference time) is not to blame for the sudden increase. By running this in Julia 1.6:

``````julia> using SnoopCompile
julia> tinf = @snoopi_deep main()
InferenceTimingNode: 165.115502/226.610818 on InferenceFrameInfo for Core.Compiler.Timings.ROOT() with 1385 direct children
``````

I get that 226.61081 is total compile time and 165.115502 is time in all phases except inference. Thus, inference time alone (61 seconds) does not explain the increase.

# Question

Which actions we need to take to cut down the compile time that does not come from inference?

SnoopCompile Has a very nice tutorial on how to cut down inference times, but how to cut other phases?

We are looking forward for help since this is a major issue for us!

Thanks!

2 Likes

Good question and I would also like to see any hints to improvements (although that’s probably a really hard problem). We experienced something similar in our hyperbolic PDE solver framework Trixi.jl, cf. this Discourse thread.

1 Like

One major problem we found was tracked down to being about a map:

2 Likes

Just testing my patched version of `Gridap.jl` from here yields

``````Julia Version 1.5.4
Commit 69fcb5745b (2021-03-11 19:13 UTC)
Platform Info:
OS: Windows (x86_64-w64-mingw32)
CPU: Intel(R) Core(TM) i7-10710U CPU @ 1.10GHz
WORD_SIZE: 64
LIBM: libopenlibm
LLVM: libLLVM-9.0.1 (ORCJIT, skylake)
Environment:
80.101978 seconds (159.74 M allocations: 7.881 GiB, 3.13% gc time)
SingleFieldFEFunction():
num_cells: 162
DomainStyle: ReferenceDomain()
Triangulation: BodyFittedTriangulation()
Triangulation id: 17548864358240605896
``````

and

``````Julia Version 1.7.0-rc3
Commit 3348de4ea6 (2021-11-15 08:22 UTC)
Platform Info:
OS: Windows (x86_64-w64-mingw32)
CPU: Intel(R) Core(TM) i7-10710U CPU @ 1.10GHz
WORD_SIZE: 64
LIBM: libopenlibm
LLVM: libLLVM-12.0.1 (ORCJIT, skylake)
Environment:
81.666169 seconds (183.65 M allocations: 10.239 GiB, 3.45% gc time, 99.60% compilation time)
SingleFieldFEFunction():
num_cells: 162
DomainStyle: ReferenceDomain()
Triangulation: BodyFittedTriangulation()
Triangulation id: 4899376070316862521
``````
1 Like

Checking performance with `@btime` yields

``````Julia Version 1.5.4
Commit 69fcb5745b (2021-03-11 19:13 UTC)
Platform Info:
OS: Windows (x86_64-w64-mingw32)
CPU: Intel(R) Core(TM) i7-10710U CPU @ 1.10GHz
WORD_SIZE: 64
LIBM: libopenlibm
LLVM: libLLVM-9.0.1 (ORCJIT, skylake)
Environment:
127.213 ms (1259619 allocations: 143.91 MiB)
SingleFieldFEFunction():
num_cells: 162
DomainStyle: ReferenceDomain()
Triangulation: BodyFittedTriangulation()
Triangulation id: 14490416472812666571
``````

and

``````Julia Version 1.7.0-rc3
Commit 3348de4ea6 (2021-11-15 08:22 UTC)
Platform Info:
OS: Windows (x86_64-w64-mingw32)
CPU: Intel(R) Core(TM) i7-10710U CPU @ 1.10GHz
WORD_SIZE: 64
LIBM: libopenlibm
LLVM: libLLVM-12.0.1 (ORCJIT, skylake)
Environment: