Hi,
When I use @time
, Julia displays the number of allocation, gc time, compilation time, (recompilation time I think?)…
Is there a way to test that the compilation time is equal to 0, i.e. that no compilation happens?
I am trying to remove any compilation from my code and I managed to do it with tools like PrecompileTools…etc. I woukd like to make sure that whoever change the code does not introduce any compilation when running some function in the package.
Thank you
Sorry maybe I am not clear. JET.jl is not what I am looking for. I am looking for a way to test (with code) whether compilation time equal 0 or not when I run @time mycode
.
Does this refer to the first time you run @time mycode
in a fresh Julia session? Or do you mean the subsequent runs?
Note that @time
tries to precompile your function before calling it.
Thus @time @eval
is needed when you want to measure actual compile times:
julia> @generated function slow_to_compile(::Type{T}) where {T}
s = 0.0
for i = 1:100_000_000
s += 1.0
end
T(s)
end
slow_to_compile (generic function with 1 method)
julia> @time @eval @time slow_to_compile(Float32)
0.000000 seconds
0.116136 seconds (8.44 k allocations: 561.078 KiB, 99.00% compilation time)
1.0f8
julia> @time @eval @time slow_to_compile(Float64)
0.000001 seconds
0.110334 seconds (6.56 k allocations: 441.352 KiB, 98.93% compilation time)
1.0e8
However, just @time foo(...)
without the @eval
is probably fine here, unless you literally need 0 compilation time, because @time
removing all compile time requires your function was thoroughly inferred from that top level call, which is a pretty good place to be.
Look at @macroexpand @time 1+2
to see how it measures compile times:
Base.cumulative_compile_timing(true)
t_start = Base.cumulative_compile_time_ns()
foo(args...) # run your code here
Base.cumulative_compile_timing(false)
t = Base.cumulative_compile_time_ns()[1] - t_start[1]
@test iszero(t)
To the first time I run the code. If I did a good at precompiling the function, then compilation time = 0 (that is what I want to test) otherwise if it shows a compilation time then I did not do my job correctly.
Looks like it is doing the trick even if I don’t fully understand what is going on. Although you need to do a dry run without the code to test before. Do you agree?
Ideally I would have a function or a macro that would tell me whether the code I am running has compile time or not (return true or false).