julia icon indicating copy to clipboard operation
julia copied to clipboard

Package load time regressions in 1.12

Open KristofferC opened this issue 10 months ago • 8 comments

I think this deserves a separate issue to track this.

❯ julia +nightly --project=@MTK_1.13 -e '@time using ModelingToolkit'
  3.292820 seconds (8.19 M allocations: 478.546 MiB, 7.74% gc time, 4.13% compilation time: 36% of which was recompilation)

  ❯ julia +1.11 --project=@MTK_1.11 -e '@time using ModelingToolkit'
  2.454841 seconds (5.07 M allocations: 346.203 MiB, 7.39% gc time, 3.76% compilation time: 31% of which was recompilation)

  ❯ julia +1.10 --project=@MTK_1.10 -e '@time using ModelingToolkit'
  2.507505 seconds (4.80 M allocations: 359.739 MiB, 10.68% gc time, 2.24% compilation time: 34% of which was recompilation)

Nightly has a big bump in load time.

KristofferC avatar Feb 17 '25 09:02 KristofferC

This seems to be worse on 1.12-nightly?

julia> VERSION
v"1.12.0-DEV.2136"

julia> @time using ModelingToolkit
  3.713581 seconds (9.52 M allocations: 519.955 MiB, 8.09% gc time, 2.98% compilation time: 31% of which was recompilation)

KristofferC avatar Apr 01 '25 19:04 KristofferC

Julia 1.12-beta2 is still looking very bad:

hyperfine 'julia +1.10 --startup-file=no -e "using KiteModels"' 'julia +1.12 --startup-file=no -e "using KiteModels"'
Benchmark 1: julia +1.10 --startup-file=no -e "using KiteModels"
  Time (mean ± σ):      5.558 s ±  0.088 s    [User: 5.205 s, System: 0.922 s]
  Range (min … max):    5.478 s …  5.746 s    10 runs
 
Benchmark 2: julia +1.12 --startup-file=no -e "using KiteModels"
  Time (mean ± σ):     10.003 s ±  0.050 s    [User: 10.030 s, System: 0.548 s]
  Range (min … max):    9.916 s … 10.074 s    10 runs
 
Summary
  julia +1.10 --startup-file=no -e "using KiteModels" ran
    1.80 ± 0.03 times faster than julia +1.12 --startup-file=no -e "using KiteModels"

ufechner7 avatar Apr 26 '25 06:04 ufechner7

Small improvement with Julia 1.12-beta3:

ufechner@ufryzen:~$ hyperfine 'julia +1.10 --startup-file=no -e "using KiteModels"' 'julia +1.12 --startup-file=no -e "using KiteModels"'
Benchmark 1: julia +1.10 --startup-file=no -e "using KiteModels"
  Time (mean ± σ):      4.626 s ±  0.079 s    [User: 4.376 s, System: 1.142 s]
  Range (min … max):    4.505 s …  4.721 s    10 runs
 
Benchmark 2: julia +1.12 --startup-file=no -e "using KiteModels"
  Time (mean ± σ):      7.482 s ±  0.091 s    [User: 7.896 s, System: 0.485 s]
  Range (min … max):    7.302 s …  7.590 s    10 runs
 
Summary
  'julia +1.10 --startup-file=no -e "using KiteModels"' ran
    1.62 ± 0.03 times faster than 'julia +1.12 --startup-file=no -e "using KiteModels"'

ufechner7 avatar May 18 '25 22:05 ufechner7

I checked on https://github.com/JuliaLang/julia/pull/58444 (required fixing global Optimizer::Any in the old version of Optim.jl KiteModels uses) Down to 1.26x

% hyperfine 'julia +1.10 --startup-file=no -e "using KiteModels"' './julia --startup-file=no -e "using KiteModels"'
Benchmark 1: julia +1.10 --startup-file=no -e "using KiteModels"
  Time (mean ± σ):      6.510 s ±  0.239 s    [User: 7.002 s, System: 0.782 s]
  Range (min … max):    6.381 s …  7.182 s    10 runs

Benchmark 2: ./julia --startup-file=no -e "using KiteModels"
  Time (mean ± σ):      8.229 s ±  0.439 s    [User: 8.708 s, System: 0.687 s]
  Range (min … max):    7.994 s …  9.430 s    10 runs

Summary
  julia +1.10 --startup-file=no -e "using KiteModels" ran
    1.26 ± 0.08 times faster than ./julia --startup-file=no -e "using KiteModels"

IanButterworth avatar May 19 '25 18:05 IanButterworth

(required fixing global Optimizer::Any in the old version of Optim.jl KiteModels uses)

Is there anything I have to fix?

ufechner7 avatar May 19 '25 21:05 ufechner7

Try master. You'll see for yourself.

IanButterworth avatar May 19 '25 22:05 IanButterworth

I can confirm that the load time regression in nightly is smaller than in 1.12:

Summary
  julia +1.10 --startup-file=no -e "using ModelingToolkit" ran
    1.38 ± 0.01 times faster than julia +nightly --startup-file=no -e "using ModelingToolkit"
Summary
  julia +1.10 --startup-file=no -e "using ModelingToolkit" ran
    1.71 ± 0.01 times faster than julia +1.12 --startup-file=no -e "using ModelingToolkit"

Slowdown of Julia nightly vs Julia 1.10: factor of 1.38 Slowdown of Julia 1.12 vs Julia 1.10: factor of 1.71

ufechner7 avatar May 20 '25 11:05 ufechner7

I tested Julia 1.12.0-beta4.

hyperfine 'julia +1.10 --startup-file=no -e "using ModelingToolkit"' 'julia +1.12 --startup-file=no -e "using ModelingToolkit"'
Benchmark 1: julia +1.10 --startup-file=no -e "using ModelingToolkit"
  Time (mean ± σ):      4.129 s ±  0.019 s    [User: 3.853 s, System: 0.847 s]
  Range (min … max):    4.107 s …  4.174 s    10 runs
 
Benchmark 2: julia +1.12 --startup-file=no -e "using ModelingToolkit"
  Time (mean ± σ):      6.022 s ±  0.015 s    [User: 6.067 s, System: 0.530 s]
  Range (min … max):    6.001 s …  6.050 s    10 runs
 
Summary
  julia +1.10 --startup-file=no -e "using ModelingToolkit" ran
    1.46 ± 0.01 times faster than julia +1.12 --startup-file=no -e "using ModelingToolkit"

Better than beta3, but - for me - not yet convincing.

Possibly related: https://github.com/SciML/ModelingToolkit.jl/issues/3706

ufechner7 avatar Jun 06 '25 03:06 ufechner7

I (vibe) coded a little script to measure load time and startup time of different julia versions:

Script
#!/usr/bin/env julia
using JSON
using Printf
using Logging

# ─── Helpers ────────────────────────────────────────────────────────────────
function run_cmd(cmd::Cmd)
    println("▶ ", cmd)
    success(run(cmd)) || error("Command failed: $cmd")
end

# Ensure each Julia version is installed via juliaup
function ensure_julia_versions(versions::Vector{String})
    @info "Ensuring Julia versions installed via juliaup..."
    for v in versions
        run_cmd(`juliaup add $v`)
    end
end

# Benchmark pure Julia startup (no package)
function benchmark_startups(versions::Vector{String}, env_root::AbstractString)
    startup = Dict{String,Float64}()
    @info "Benchmarking Julia startup times…"
    for (i, ver) in enumerate(versions)
        println("\n[$i/$(length(versions))] Julia $ver  (startup)")
        d = joinpath(env_root, "julia-$ver", "__startup__")
        mkpath(d)
        jf = joinpath(d, "startup.json")
        julia_cmd = "julia +$ver --startup-file=no -e ''"
        hf = `hyperfine --export-json $jf $julia_cmd`
        run_cmd(hf)
        data = JSON.parsefile(jf)
        startup[ver] = data["results"][1]["min"]
    end
    return startup
end

# Install a single package into a fresh environment
function install_package(ver::String, pkg::String, env_dir::AbstractString)
    mkpath(env_dir)
    add_cmd = "using Pkg; Pkg.add(\"$pkg\")"
    run_cmd(`julia +$ver --project=$env_dir -e $add_cmd`)
end

# Benchmark “using pkg” (includes startup), return raw min time
function benchmark_package(ver::String, pkg::String, env_dir::AbstractString)
    jf = joinpath(env_dir, "hf.json")
    julia_cmd = "julia +$ver --startup-file=no --project=$env_dir -e 'using $pkg'"
    hf = `hyperfine --export-json $jf $julia_cmd`
    run_cmd(hf)
    data = JSON.parsefile(jf)
    return data["results"][1]["min"]
end

# Loop over all version×package combos and collect raw timings
function benchmark_all(versions::Vector{String},
                       packages::Vector{String},
                       env_root::AbstractString)
    pkg_times = Dict{Tuple{String,String},Float64}()
    total = length(versions) * length(packages)
    count = 0

    @info "Benchmarking package load times…"
    for ver in versions
        for pkg in packages
            count += 1
            println("\n[$count/$total] Julia $ver → $pkg")
            env_dir = joinpath(env_root, "julia-$ver", pkg)
            install_package(ver, pkg, env_dir)
            t_raw = benchmark_package(ver, pkg, env_dir)
            pkg_times[(ver,pkg)] = t_raw
        end
    end

    return pkg_times
end

# Emit a markdown table: first “Startup” row, then one row per package,
# subtracting each version’s startup time and computing % vs baseline
function emit_markdown(startup::Dict{String,Float64},
                       pkg_times::Dict{Tuple{String,String},Float64},
                       versions::Vector{String},
                       packages::Vector{String},
                       results_md::AbstractString)

    baseline = versions[1]
    base_start = startup[baseline]

    io = IOBuffer()
    println(io, "| Item        | Version | Time (s) | Change vs $baseline |")
    println(io, "|:----------- |:-------:|---------:|--------------------:|")

    # Startup times
    for ver in versions
        t = startup[ver]
        pct = (t - base_start)/base_start*100
        println(io, @sprintf("| %-11s | %-7s | %8.3f | %+7.2f%% |",
                             "Startup", ver, t, pct))
    end

    # Package load times (subtract startup)
    for pkg in packages
        base_pkg = pkg_times[(baseline,pkg)] - base_start
        for ver in versions
            t = pkg_times[(ver,pkg)] - startup[ver]
            pct = (t - base_pkg)/base_pkg*100
            println(io, @sprintf("| %-11s | %-7s | %8.3f | %+7.2f%% |",
                                 pkg, ver, t, pct))
        end
    end

    md = String(take!(io))
    open(results_md, "w") do f
        write(f, md)
    end

    println("\n✅ Done. Results:\n")
    print(md)
    println("\n(also saved to `$results_md`)")
end

# ─── Main Entrypoint ─────────────────────────────────────────────────────────
function main(versions, packages, env_root, results_md)
    @info "Environments will be stored under $env_root"
    mkpath(env_root)

    ensure_julia_versions(versions)
    startup = benchmark_startups(versions, env_root)
    pkg_times = benchmark_all(versions, packages, env_root)
    emit_markdown(startup, pkg_times, versions, packages, results_md)
end

# ─── User-configurable globals ─────────────────────────────────────────────
const JULIA_VERSIONS = ["1.10.9", "1.11.5", "1.12-nightly", "nightly"]  # baseline is first
const PACKAGES      = ["DataFrames", "Plots", "ModelingToolkit", "CairoMakie"]
const ENV_ROOT      = mktempdir()                                   # temp projects here
const RESULTS_MD    = "results.md"                                  # output file

# ─── Run! ───────────────────────────────────────────────────────────────────
main(JULIA_VERSIONS, PACKAGES, ENV_ROOT, RESULTS_MD)

Results:

Item Version Time (s) Change vs 1.10
Startup 1.10.9 0.102 +0.00%
Startup 1.11.5 0.086 -15.82%
Startup 1.12-nightly 0.110 +7.16%
Startup nightly 0.079 -22.46%
DataFrames 1.10.9 0.312 +0.00%
DataFrames 1.11.5 0.259 -17.00%
DataFrames 1.12-nightly 0.427 +36.85%
DataFrames nightly 0.437 +39.90%
Plots 1.10.9 0.707 +0.00%
Plots 1.11.5 0.978 +38.31%
Plots 1.12-nightly 0.939 +32.76%
Plots nightly 0.925 +30.80%
ModelingToolkit 1.10.9 3.030 +0.00%
ModelingToolkit 1.11.5 3.086 +1.83%
ModelingToolkit 1.12-nightly 3.652 +20.52%
ModelingToolkit nightly 4.196 +38.47%
CairoMakie 1.10.9 2.298 +0.00%
CairoMakie 1.11.5 3.292 +43.26%
CairoMakie 1.12-nightly 3.348 +45.70%
CairoMakie nightly 3.498 +52.24%

It sems for some packages, the load time regression came in 1.11 (except for DataFrames and ModelingToolkit).

KristofferC avatar Jun 18 '25 07:06 KristofferC

# Julia 1.10.9
julia> @time using ModelingToolkit
  3.270877 seconds (5.32 M allocations: 387.316 MiB, 14.69% gc time, 2.64% compilation time: 33% of which was recompilation)
# Julia 1.11.5
julia> @time using ModelingToolkit
  3.777953 seconds (6.95 M allocations: 434.050 MiB, 11.09% gc time, 5.71% compilation time: 74% of which was recompilation)
# Julia 1.12.0-beta4.33 (2025-06-20)
julia> @time using ModelingToolkit
  4.915161 seconds (13.43 M allocations: 796.804 MiB, 14.04% gc time, 20.00% compilation time: 15% of which was recompilation)

julia> versioninfo()
Julia Version 1.12.0-beta4.33
Commit 8ec81e2b57* (2025-06-20 05:40 UTC)
Platform Info:
  OS: Linux (x86_64-linux-gnu)
  CPU: 32 × AMD Ryzen 9 7950X 16-Core Processor
  WORD_SIZE: 64
  LLVM: libLLVM-18.1.7 (ORCJIT, znver4)
  GC: Built with stock GC
Threads: 1 default, 1 interactive, 1 GC (on 32 virtual cores)
Environment:
  LD_LIBRARY_PATH = /lib:/usr/lib:/usr/local/lib

So I see a regression of 50% compared to Julia 1.10, and a regression of 30% compared to Julia 1.11, which is a much larger regression than @KristofferC reported.

ufechner7 avatar Jun 21 '25 12:06 ufechner7

I think we have to punt on getting all this fixed for 1.12.0 and backport improvements instead. It is at least better now than when I opened this issue.

KristofferC avatar Jul 01 '25 15:07 KristofferC

It's sad that this (and much worse, these) user experience degradation, which IMO should be release blockers, keep being sacrificed.

joa-quim avatar Jul 01 '25 18:07 joa-quim

Here are some numbers from RxInfer.jl package

→ hyperfine 'julia +1.10 --startup-file=no rxinfer_using.jl' 'julia +1.11 --startup-file=no rxinfer_using.jl' 'julia +1.12 --startup-file=no rxinfer_using.jl' 'julia +nightly --startup-file=no rxinfer_using.jl'
Benchmark 1: julia +1.10 --startup-file=no rxinfer_using.jl
  Time (mean ± σ):      1.934 s ±  0.182 s    [User: 2.744 s, System: 0.215 s]
  Range (min … max):    1.866 s …  2.449 s    10 runs

Benchmark 2: julia +1.11 --startup-file=no rxinfer_using.jl
  Time (mean ± σ):      7.325 s ±  0.322 s    [User: 7.889 s, System: 0.378 s]
  Range (min … max):    7.167 s …  8.201 s    10 runs

Benchmark 3: julia +1.12 --startup-file=no rxinfer_using.jl
  Time (mean ± σ):      8.314 s ±  0.263 s    [User: 8.946 s, System: 0.355 s]
  Range (min … max):    8.187 s …  9.053 s    10 runs

Benchmark 4: julia +nightly --startup-file=no rxinfer_using.jl
  Time (mean ± σ):      5.554 s ±  0.327 s    [User: 5.246 s, System: 0.237 s]
  Range (min … max):    5.413 s …  6.468 s    10 runs

Summary
  julia +1.10 --startup-file=no rxinfer_using.jl ran
    2.87 ± 0.32 times faster than julia +nightly --startup-file=no rxinfer_using.jl
    3.79 ± 0.39 times faster than julia +1.11 --startup-file=no rxinfer_using.jl
    4.30 ± 0.43 times faster than julia +1.12 --startup-file=no rxinfer_using.jl

rxinfer_using.jl file has just one line of using RxInfer. This is significant UX degradation, which is especially noticeable in Jupyter notebooks and Pluto.

More benchmarks involving some payload.

→ hyperfine 'julia +1.10 --startup-file=no rxinfer_benchmark.jl' 'julia +1.11 --startup-file=no rxinfer_benchmark.jl' 'julia +1.12 --startup-file=no rxinfer_benchmark.jl' 'julia +nightly --startup-file=no rxinfer_benchmark.jl'
Benchmark 1: julia +1.10 --startup-file=no rxinfer_benchmark.jl
  Time (mean ± σ):     14.070 s ±  0.144 s    [User: 14.815 s, System: 0.282 s]
  Range (min … max):   13.733 s … 14.181 s    10 runs

Benchmark 2: julia +1.11 --startup-file=no rxinfer_benchmark.jl
  Time (mean ± σ):     21.639 s ±  0.449 s    [User: 21.790 s, System: 0.510 s]
  Range (min … max):   21.057 s … 22.433 s    10 runs

Benchmark 3: julia +1.12 --startup-file=no rxinfer_benchmark.jl
  Time (mean ± σ):     23.676 s ±  0.388 s    [User: 24.037 s, System: 0.525 s]
  Range (min … max):   23.329 s … 24.609 s    10 runs

Benchmark 4: julia +nightly --startup-file=no rxinfer_benchmark.jl
  Time (mean ± σ):     21.621 s ±  0.286 s    [User: 22.093 s, System: 0.449 s]
  Range (min … max):   21.395 s … 22.354 s    10 runs

Summary
  julia +1.10 --startup-file=no rxinfer_benchmark.jl ran
    1.54 ± 0.03 times faster than julia +nightly --startup-file=no rxinfer_benchmark.jl
    1.54 ± 0.04 times faster than julia +1.11 --startup-file=no rxinfer_benchmark.jl
    1.68 ± 0.03 times faster than julia +1.12 --startup-file=no rxinfer_benchmark.jl
julia> versioninfo()
Julia Version 1.11.5
Commit 760b2e5b739 (2025-04-14 06:53 UTC)
Build Info:
  Official https://julialang.org/ release
Platform Info:
  OS: macOS (arm64-apple-darwin24.0.0)
  CPU: 11 × Apple M3 Pro
  WORD_SIZE: 64
  LLVM: libLLVM-16.0.6 (ORCJIT, apple-m2)
Threads: 1 default, 0 interactive, 1 GC (on 5 virtual cores)
The `rxinfer_benchmark.jl` is the following:
using RxInfer, Random

@model function linear_gaussian_ssm_smoothing(y, A, B, P, Q)

    # Set a prior distribution for x[1]
    x[1] ~ MvNormal(μ = [ 0.0, 0.0 ], Σ = [ 100.0 0.0; 0.0 100.0 ])
    y[1] ~ MvNormal(μ = B * x[1], Σ = Q)

    for t in 2:length(y)
        x[t] ~ MvNormal(μ = A * x[t - 1], Σ = P)
        y[t] ~ MvNormal(μ = B * x[t], Σ = Q)
    end

end

@model function linear_gaussian_ssm_filtering(x_min_t_mean, x_min_t_cov, y_t, A, B, P, Q)
    x_min_t ~ MvNormal(μ = x_min_t_mean, Σ = x_min_t_cov)
    x_t     ~ MvNormal(μ = A * x_min_t, Σ = P)
    y_t     ~ MvNormal(μ = B * x_t, Σ = Q)
end

function generate_data(n, A, B, P, Q; seed = 42)
    Random.seed!(seed)

    x_prev = zeros(2)
    x      = Vector{Vector{Float64}}(undef, n)
    y      = Vector{Vector{Float64}}(undef, n)

    for i in 1:n
        x[i]   = rand(MvNormal(A * x_prev, P))
        y[i]   = rand(MvNormal(B * x[i], Q))
        x_prev = x[i]
    end

    return x, y
end

n = 200
θ = π / 15
A = [ cos(θ) -sin(θ); sin(θ) cos(θ) ]
B = [ 1.3 0.0; 0.0 0.7 ]
P = [ 0.05 0.0; 0.0 0.05 ]
Q = [ 10.0 0.0; 0.0 10.0 ]


real_x, real_y = generate_data(n, A, B, P, Q);

function rxinfer_inference_smoothing(observations, A, B, P, Q)
    n = length(observations)

    result = infer(
        model = linear_gaussian_ssm_smoothing(A = A, B = B, P = P, Q = Q),
        data = (y = observations, ),
        options = (limit_stack_depth = 500, )
    )

    return result.posteriors[:x]
end

# Inference procedure for single time step graph and filtering
function rxinfer_inference_filtering(observations, A, B, P, Q)
    n = length(observations)

    autoupdates = @autoupdates begin
        x_min_t_mean, x_min_t_cov = mean_cov(q(x_t))
    end

    result = infer(
        model = linear_gaussian_ssm_filtering(A = A, B = B, P = P, Q = Q),
        data = (y_t = observations, ),
        autoupdates = autoupdates,
        initialization = @initialization(q(x_t) = MvNormalMeanCovariance([ 0.0, 0.0 ], [ 100.0 0.0; 0.0 100.0 ])),
        historyvars = (x_t = KeepLast(), ),
        keephistory = n
    )

    return result.history[:x_t]
end

x_rxinfer_smoothing_inferred = rxinfer_inference_smoothing(real_y, A, B, P, Q);
x_rxinfer_filtering_inferred = rxinfer_inference_filtering(real_y, A, B, P, Q);

x_rxinfer_smoothing_inferred != x_rxinfer_filtering_inferred

bvdmitri avatar Jul 08 '25 10:07 bvdmitri

@time_imports reports would be good to add.

Do we also need to add some more granular timing within loading to help characterize things in the wild without having to pull out profiling tools?

IanButterworth avatar Jul 08 '25 11:07 IanButterworth

Julia 1.11.5:

julia> @time using ModelingToolkit
  3.830307 seconds (6.73 M allocations: 417.226 MiB, 6.06% gc time, 5.72% compilation time: 93% of which was recompilation)

Julia 1.12-beta4.80 (2025-07-08):

julia> @time using ModelingToolkit
  6.155234 seconds (16.10 M allocations: 940.357 MiB, 13.21% gc time, 21.38% compilation time: 13% of which was recompilation)

So Julia 1.12-beta4.80 (2025-07-08) is 60% slower than Julia 1.11.5.

Output of @time_imports on 1.12:

julia> @time_imports using ModelingToolkit
      1.4 ms  Printf
     32.7 ms  Dates
      0.5 ms  TOML
      0.4 ms  Preferences
      0.1 ms  PrecompileTools
      0.1 ms  Reexport
      0.9 ms  StaticArraysCore
     97.9 ms  StaticArrays
      6.2 ms  CommonWorldInvalidations
               ┌ 0.0 ms DocStringExtensions.__init__() 
      1.0 ms  DocStringExtensions
      0.2 ms  IntegerMathUtils
      4.6 ms  Primes
      3.6 ms  MacroTools
      0.2 ms  ConstructionBase
      0.2 ms  ConstructionBase → ConstructionBaseLinearAlgebraExt
      6.3 ms  Setfield
      0.5 ms  CompositeTypes
      7.7 ms  IntervalSets
      0.2 ms  IntervalSets → IntervalSetsRandomExt
     38.0 ms  DomainSets
      0.3 ms  ConstructionBase → ConstructionBaseIntervalSetsExt
      0.5 ms  ConstructionBase → ConstructionBaseStaticArraysExt
      0.2 ms  TermInterface
      0.9 ms  Unityper
      0.1 ms  UUIDs
      0.2 ms  Compat
      0.1 ms  Compat → CompatLinearAlgebraExt
      5.0 ms  OrderedCollections
     32.6 ms  DataStructures
      0.3 ms  ExprTools
      0.7 ms  Serialization
      0.8 ms  RuntimeGeneratedFunctions
      0.6 ms  ArrayInterface
      0.3 ms  ArrayInterface → ArrayInterfaceStaticArraysCoreExt
               ┌ 0.0 ms InverseFunctions.__init__() 
      0.3 ms  InverseFunctions
      0.1 ms  CompositionsBase
      0.1 ms  CompositionsBase → CompositionsBaseInverseFunctionsExt
      0.1 ms  InverseFunctions → InverseFunctionsDatesExt
               ┌ 0.0 ms Accessors.__init__() 
      6.1 ms  Accessors
      0.2 ms  Accessors → LinearAlgebraExt
      0.1 ms  DataValueInterfaces
      0.3 ms  DataAPI
      0.1 ms  IteratorInterfaceExtensions
      0.1 ms  TableTraits
     13.1 ms  Tables
      1.3 ms  StringManipulation
      3.2 ms  Crayons
      1.0 ms  LaTeXStrings
     31.5 ms  PrettyTables
      3.1 ms  SymbolicIndexingInterface
      3.4 ms  ExproniconLite
      0.3 ms  TaskLocalValues
      1.1 ms  WeakValueDicts
     11.6 ms  IrrationalConstants
      0.4 ms  LogExpFunctions
               ┌ 0.0 ms OpenLibm_jll.__init__() 
      0.2 ms  OpenLibm_jll
      0.3 ms  JLLWrappers
               ┌ 0.2 ms CompilerSupportLibraries_jll.__init__() 
      0.3 ms  CompilerSupportLibraries_jll
               ┌ 71.4 ms OpenSpecFun_jll.__init__() 99.60% compilation time (90% recompilation)
     71.7 ms  OpenSpecFun_jll 99.18% compilation time (90% recompilation)
      4.8 ms  SpecialFunctions
      0.2 ms  LogExpFunctions → LogExpFunctionsInverseFunctionsExt
      0.3 ms  NaNMath
               ┌ 0.0 ms TimerOutputs.__init__() 
      4.8 ms  TimerOutputs
     10.2 ms  AbstractTrees
      2.9 ms  Combinatorics
               ┌ 0.5 ms SuiteSparse_jll.__init__() 
      0.8 ms  SuiteSparse_jll
               ┌ 0.1 ms SparseArrays.CHOLMOD.__init__() 
    142.2 ms  SparseArrays
      0.1 ms  Logging
     15.1 ms  Test
    142.1 ms  MutableArithmetics
     14.9 ms  ChainRulesCore
      0.3 ms  ChainRulesCore → ChainRulesCoreSparseArraysExt
     41.3 ms  MultivariatePolynomials
      0.3 ms  ArrayInterface → ArrayInterfaceSparseArraysExt
      0.3 ms  InverseFunctions → InverseFunctionsTestExt
      0.3 ms  Accessors → TestExt
      0.1 ms  ArrayInterface → ArrayInterfaceChainRulesCoreExt
      0.8 ms  LogExpFunctions → LogExpFunctionsChainRulesCoreExt
      2.0 ms  SpecialFunctions → SpecialFunctionsChainRulesCoreExt
      0.1 ms  Future
      9.7 ms  DynamicPolynomials
      1.6 ms  Bijections
      0.3 ms  Accessors → StaticArraysExt
      0.2 ms  StaticArrays → StaticArraysChainRulesCoreExt
     90.0 ms  SymbolicUtils
      0.3 ms  Accessors → IntervalSetsExt
      2.8 ms  RecipesBase
      1.5 ms  Statistics
      0.3 ms  Adapt
      0.4 ms  GPUArraysCore
      0.2 ms  ArrayInterface → ArrayInterfaceGPUArraysCoreExt
     23.2 ms  RecursiveArrayTools
      0.3 ms  SciMLStructures
               ┌ 0.0 ms Distributed.__init__() 
     23.9 ms  Distributed 61.13% compilation time
      0.2 ms  CommonSolve
      4.4 ms  FunctionWrappers
      0.2 ms  FunctionWrappersWrappers
      0.5 ms  EnumX
      6.0 ms  ADTypes
      0.5 ms  ADTypes → ADTypesConstructionBaseExt
      4.1 ms  Jieko
     29.3 ms  Moshi
     17.5 ms  SciMLOperators
      0.2 ms  SciMLOperators → SciMLOperatorsStaticArraysCoreExt
               ┌ 0.0 ms SciMLBase.__init__() 
    136.8 ms  SciMLBase
      0.2 ms  IntervalSets → IntervalSetsRecipesBaseExt
      0.1 ms  IntervalSets → IntervalSetsStatisticsExt
      0.2 ms  StaticArrays → StaticArraysStatisticsExt
      0.1 ms  Statistics → SparseArraysExt
      0.1 ms  Adapt → AdaptStaticArraysExt
      0.2 ms  Adapt → AdaptSparseArraysExt
      0.3 ms  RecursiveArrayTools → RecursiveArrayToolsSparseArraysExt
      0.1 ms  ADTypes → ADTypesChainRulesCoreExt
      0.1 ms  SciMLOperators → SciMLOperatorsSparseArraysExt
      0.5 ms  SciMLBase → SciMLBaseChainRulesCoreExt
      2.3 ms  SymbolicLimits
     10.9 ms  OffsetArrays
      0.5 ms  OffsetArrays → OffsetArraysAdaptExt
      0.7 ms  DiffRules
      0.6 ms  SortingAlgorithms
      5.1 ms  Missings
      0.3 ms  StatsAPI
      0.3 ms  PtrArrays
      1.8 ms  AliasTables
     12.4 ms  StatsBase
      0.2 ms  SuiteSparse
     10.8 ms  PDMats
               ┌ 0.2 ms Rmath_jll.__init__() 
      0.5 ms  Rmath_jll
               ┌ 0.0 ms Rmath.__init__() 
      0.8 ms  Rmath
      2.6 ms  HypergeometricFunctions
      1.9 ms  StatsFuns
      3.0 ms  QuadGK
     54.1 ms  FillArrays
      0.2 ms  FillArrays → FillArraysPDMatsExt
      1.8 ms  FillArrays → FillArraysSparseArraysExt
      0.3 ms  FillArrays → FillArraysStatisticsExt
               ┌ 0.0 ms Distributions.TestUtils.__init__() 
     68.3 ms  Distributions
      0.2 ms  StatsFuns → StatsFunsInverseFunctionsExt
      0.5 ms  StatsFuns → StatsFunsChainRulesCoreExt
      0.7 ms  Distributions → DistributionsTestExt
      0.6 ms  Distributions → DistributionsChainRulesCoreExt
      3.2 ms  Format
      7.6 ms  Latexify
      0.2 ms  Latexify → SparseArraysExt
               ┌ 0.0 ms Symbolics.__init__() 
    146.1 ms  Symbolics
      0.3 ms  ConcreteStructs
      0.1 ms  FastPower
      0.2 ms  MuladdMacro
      0.1 ms  UnPack
      0.3 ms  Parameters
      0.1 ms  IfElse
     37.1 ms  Static
     20.6 ms  StaticArrayInterface
      0.7 ms  ManualMemory
               ┌ 0.0 ms ThreadingUtilities.__init__() 
      0.7 ms  ThreadingUtilities
      0.2 ms  SIMDTypes
      1.7 ms  LayoutPointers
      6.0 ms  CloseOpenIntervals
     10.9 ms  StrideArraysCore
      0.2 ms  BitTwiddlingConvenienceFunctions
      0.7 ms  CpuId
               ┌ 36.9 ms CPUSummary.__init__() 99.88% compilation time (83% recompilation)
     38.9 ms  CPUSummary 94.75% compilation time (83% recompilation)
               ┌ 0.0 ms PolyesterWeave.__init__() 
      5.5 ms  PolyesterWeave
      1.0 ms  Polyester
      1.2 ms  FastBroadcast
      0.2 ms  RecursiveArrayTools → RecursiveArrayToolsFastBroadcastExt
               ┌ 0.0 ms TruncatedStacktraces.__init__() 
      0.2 ms  TruncatedStacktraces
      0.2 ms  FastClosures
      2.0 ms  DiffEqBase
               ┌ 0.0 ms DifferentiationInterface.__init__() 
      4.0 ms  DifferentiationInterface
      0.2 ms  DifferentiationInterface → DifferentiationInterfaceGPUArraysCoreExt
      1.6 ms  Functors
      4.6 ms  DiffEqCallbacks
      2.7 ms  StaticArrayInterface → StaticArrayInterfaceStaticArraysExt
      1.3 ms  StaticArrayInterface → StaticArrayInterfaceOffsetArraysExt
      0.3 ms  DiffEqBase → DiffEqBaseDistributionsExt
      0.2 ms  DiffEqBase → DiffEqBaseChainRulesCoreExt
      0.1 ms  DiffEqBase → DiffEqBaseSparseArraysExt
      0.2 ms  DifferentiationInterface → DifferentiationInterfaceChainRulesCoreExt
      0.2 ms  DifferentiationInterface → DifferentiationInterfaceStaticArraysExt
      0.1 ms  DifferentiationInterface → DifferentiationInterfaceSparseArraysExt
      0.6 ms  DifferentiationInterface → DifferentiationInterfaceSymbolicsExt
      0.7 ms  SimpleTraits
      1.4 ms  ArnoldiMethod
      0.3 ms  Inflate
      0.3 ms  Mmap
      3.6 ms  SharedArrays
     16.5 ms  Graphs
      0.3 ms  ResettableStacks
      5.2 ms  RandomNumbers
      1.7 ms  Random123
      0.2 ms  PoissonRandom
      1.1 ms  FiniteDiff
      0.8 ms  DifferentiationInterface → DifferentiationInterfaceFiniteDiffExt
      2.3 ms  DiffResults
      0.4 ms  CommonSubexpressions
     66.9 ms  ForwardDiff
      1.3 ms  DifferentiationInterface → DifferentiationInterfaceForwardDiffExt
      5.2 ms  NLSolversBase
      0.4 ms  PositiveFactorizations
      4.1 ms  LineSearches
      0.2 ms  FiniteDiff → FiniteDiffSparseArraysExt
     11.8 ms  Optim
      0.3 ms  FiniteDiff → FiniteDiffStaticArraysExt
      0.1 ms  FastPower → FastPowerForwardDiffExt
      0.2 ms  RecursiveArrayTools → RecursiveArrayToolsForwardDiffExt
      1.2 ms  DiffEqBase → DiffEqBaseForwardDiffExt
      0.7 ms  ForwardDiff → ForwardDiffStaticArraysExt
      3.1 ms  DiffEqNoiseProcess
      3.7 ms  Symbolics → SymbolicsForwardDiffExt
     13.4 ms  JumpProcesses
    105.3 ms  Unitful
      0.2 ms  Accessors → UnitfulExt
      0.4 ms  DiffEqBase → DiffEqBaseUnitfulExt
      0.1 ms  Unitful → InverseFunctionsUnitfulExt
      0.3 ms  Unitful → ForwardDiffExt
      0.6 ms  Unitful → PrintfExt
      0.1 ms  Unitful → ConstructionBaseUnitfulExt
      4.5 ms  URIs
     22.8 ms  JuliaSyntax
      1.8 ms  Glob
     26.3 ms  CommonMark
     96.8 ms  JuliaFormatter
     52.0 ms  MLStyle
      0.4 ms  SciMLBase → SciMLBaseMLStyleExt
      0.6 ms  MaybeInplace
      1.7 ms  SciMLJacobianOperators
      2.2 ms  LineSearch
      2.6 ms  EnzymeCore
      0.2 ms  ADTypes → ADTypesEnzymeCoreExt
      0.1 ms  EnzymeCore → AdaptExt
      7.5 ms  NonlinearSolveBase
      0.3 ms  NonlinearSolveBase → NonlinearSolveBaseLineSearchExt
      0.2 ms  NonlinearSolveBase → NonlinearSolveBaseDiffEqBaseExt
    215.1 ms  ArrayLayouts
      1.0 ms  ArrayLayouts → ArrayLayoutsSparseArraysExt
     61.2 ms  LazyArrays
     19.4 ms  Krylov
               ┌ 0.0 ms NetworkOptions.__init__() 
      0.6 ms  NetworkOptions
               ┌ 0.8 ms OpenSSL_jll.__init__() 
      1.0 ms  OpenSSL_jll
               ┌ 0.1 ms LibSSH2_jll.__init__() 
      0.3 ms  LibSSH2_jll
               ┌ 0.1 ms LibGit2_jll.__init__() 
      0.3 ms  LibGit2_jll
     20.1 ms  LibGit2
      7.3 ms  ArgTools
               ┌ 0.1 ms nghttp2_jll.__init__() 
      0.3 ms  nghttp2_jll
               ┌ 0.0 ms Zlib_jll.__init__() 
      0.2 ms  Zlib_jll
               ┌ 0.1 ms LibCURL_jll.__init__() 
      0.3 ms  LibCURL_jll
               ┌ 0.0 ms MozillaCACerts_jll.__init__() 
      0.2 ms  MozillaCACerts_jll
               ┌ 0.0 ms LibCURL.__init__() 
      1.5 ms  LibCURL
               ┌ 0.6 ms Downloads.Curl.__init__() 
      6.8 ms  Downloads
      2.1 ms  Tar
               ┌ 0.0 ms p7zip_jll.__init__() 
      0.3 ms  p7zip_jll
               ┌ 0.0 ms Pkg.__init__() 
    173.7 ms  Pkg
      0.3 ms  LazyArtifacts
               ┌ 1127.7 ms IntelOpenMP_jll.__init__() 99.96% compilation time
   1128.0 ms  IntelOpenMP_jll 99.94% compilation time
               ┌ 71.7 ms oneTBB_jll.__init__() 98.94% compilation time (100% recompilation)
     72.1 ms  oneTBB_jll 98.39% compilation time (100% recompilation)
               ┌ 1.0 ms MKL_jll.__init__() 
      1.4 ms  MKL_jll
               ┌ 0.0 ms LinearSolve.__init__() 
     18.6 ms  LinearSolve
      0.2 ms  MaybeInplace → MaybeInplaceSparseArraysExt
     26.7 ms  LinearSolve → LinearSolveSparseArraysExt
      0.7 ms  LinearSolve → LinearSolveEnzymeExt
      0.2 ms  NonlinearSolveBase → NonlinearSolveBaseLinearSolveExt
      0.2 ms  NonlinearSolveBase → NonlinearSolveBaseSparseArraysExt
      6.3 ms  LinearSolve → LinearSolveForwardDiffExt
      0.5 ms  NonlinearSolveBase → NonlinearSolveBaseForwardDiffExt
    180.8 ms  NonlinearSolveFirstOrder
     70.3 ms  NonlinearSolveQuasiNewton
      0.7 ms  NonlinearSolveQuasiNewton → NonlinearSolveQuasiNewtonForwardDiffExt
      5.4 ms  BracketingNonlinearSolve
      0.8 ms  BracketingNonlinearSolve → BracketingNonlinearSolveForwardDiffExt
     16.5 ms  SimpleNonlinearSolve
      0.4 ms  BracketingNonlinearSolve → BracketingNonlinearSolveChainRulesCoreExt
      0.2 ms  SimpleNonlinearSolve → SimpleNonlinearSolveChainRulesCoreExt
      0.2 ms  SimpleNonlinearSolve → SimpleNonlinearSolveDiffEqBaseExt
     14.0 ms  SparseMatrixColorings
      1.0 ms  DifferentiationInterface → DifferentiationInterfaceSparseMatrixColoringsExt
      2.0 ms  NonlinearSolveBase → NonlinearSolveBaseSparseMatrixColoringsExt
     29.8 ms  NonlinearSolveSpectralMethods
      0.6 ms  NonlinearSolveSpectralMethods → NonlinearSolveSpectralMethodsForwardDiffExt
     49.7 ms  NonlinearSolve
      0.4 ms  LineSearch → LineSearchLineSearchesExt
      0.2 ms  LazyArrays → LazyArraysStaticArraysExt
      0.4 ms  SCCNonlinearSolve
      0.2 ms  SimpleUnPack
     10.7 ms  OrdinaryDiffEqCore
      0.3 ms  OrdinaryDiffEqCore → OrdinaryDiffEqCoreEnzymeCoreExt
      0.5 ms  ImplicitDiscreteSolve
    296.2 ms  BlockArrays
     23.5 ms  LazyArrays → LazyArraysBlockArraysExt
      0.3 ms  BlockArrays → BlockArraysAdaptExt
      4.1 ms  DispatchDoctor
      0.2 ms  TestItems
    366.8 ms  DynamicQuantities
      0.3 ms  DispatchDoctor → DispatchDoctorEnzymeCoreExt
      0.4 ms  DispatchDoctor → DispatchDoctorChainRulesCoreExt
     20.0 ms  DynamicQuantities → DynamicQuantitiesLinearAlgebraExt
      2.1 ms  DynamicQuantities → DynamicQuantitiesUnitfulExt
      0.4 ms  SciMLPublic
      0.3 ms  FindFirstFunctions
    875.7 ms  ModelingToolkit

ufechner7 avatar Jul 08 '25 12:07 ufechner7

Needs a comparison to be helpful. Putting them side by side in a markdown table is most helpful.

IanButterworth avatar Jul 08 '25 13:07 IanButterworth

Well, @time_imports does not exist for Julia 1.11.

ufechner7 avatar Jul 08 '25 13:07 ufechner7

It does (but not 1.10 I think).

KristofferC avatar Jul 08 '25 13:07 KristofferC

time_1.12 package Time_1.11 package Extra_packages
10.4 AbstractTrees 4.9 AbstractTrees
6.9 Accessors 0.3 Accessors → IntervalSetsExt
0.3 Accessors → IntervalSetsExt 0.2 Accessors → LinearAlgebraExt
0.2 Accessors → LinearAlgebraExt 0.3 Accessors → StaticArraysExt
0.3 Accessors → StaticArraysExt 0.2 Accessors → TestExt
0.4 Accessors → TestExt 0.3 Accessors → UnitfulExt
0.3 Accessors → UnitfulExt 15.1 Accessors 37.79% compilation time (100% recompilation)
1.8 Adapt 0.2 Adapt
0.2 Adapt → AdaptSparseArraysExt 0.1 Adapt → AdaptSparseArraysExt
0.1 Adapt → AdaptStaticArraysExt 0.1 Adapt → AdaptStaticArraysExt
6 ADTypes 2.1 ADTypes
0.1 ADTypes → ADTypesChainRulesCoreExt 0.1 ADTypes → ADTypesChainRulesCoreExt
0.5 ADTypes → ADTypesConstructionBaseExt 0.3 ADTypes → ADTypesConstructionBaseExt
0.2 ADTypes → ADTypesEnzymeCoreExt 0.1 ADTypes → ADTypesEnzymeCoreExt
1.8 AliasTables 0.7 AliasTables
7.8 ArgTools 7.8
1.4 ArnoldiMethod 0.9 ArnoldiMethod
0.6 ArrayInterface 0.6 ArrayInterface
0.2 ArrayInterface → ArrayInterfaceChainRulesCoreExt 0.1 ArrayInterface → ArrayInterfaceChainRulesCoreExt
0.2 ArrayInterface → ArrayInterfaceGPUArraysCoreExt 0.1 ArrayInterface → ArrayInterfaceGPUArraysCoreExt
0.3 ArrayInterface → ArrayInterfaceSparseArraysExt 0.2 ArrayInterface → ArrayInterfaceSparseArraysExt
0.3 ArrayInterface → ArrayInterfaceStaticArraysCoreExt 0.2 ArrayInterface → ArrayInterfaceStaticArraysCoreExt
222.1 ArrayLayouts 159 ArrayLayouts
1.1 ArrayLayouts → ArrayLayoutsSparseArraysExt 0.8 ArrayLayouts → ArrayLayoutsSparseArraysExt
2.6 Bijections 0.7 Bijections
0.2 BitTwiddlingConvenienceFunctions 0.2 BitTwiddlingConvenienceFunctions
247.9 BlockArrays 143.9 BlockArrays
0.3 BlockArrays → BlockArraysAdaptExt 0.3 BlockArrays → BlockArraysAdaptExt
5.9 BracketingNonlinearSolve 11.2 BracketingNonlinearSolve
0.4 BracketingNonlinearSolve → BracketingNonlinearSolveChainRulesCoreExt 0.5 BracketingNonlinearSolve → BracketingNonlinearSolveChainRulesCoreExt
1.1 BracketingNonlinearSolve → BracketingNonlinearSolveForwardDiffExt 0.7 BracketingNonlinearSolve → BracketingNonlinearSolveForwardDiffExt
15.3 ChainRulesCore 13.5 ChainRulesCore
0.3 ChainRulesCore → ChainRulesCoreSparseArraysExt 0.3 ChainRulesCore → ChainRulesCoreSparseArraysExt
7.4 CloseOpenIntervals 2.2 CloseOpenIntervals
3.9 Combinatorics 1.3 Combinatorics
26.1 CommonMark 37.4 CommonMark
0.2 CommonSolve 0.2 CommonSolve
0.4 CommonSubexpressions 0.2 CommonSubexpressions
7.1 CommonWorldInvalidations 0.5 CommonWorldInvalidations
0.2 Compat 0.2 Compat
0.1 Compat → CompatLinearAlgebraExt 0.1 Compat → CompatLinearAlgebraExt
0.3 CompilerSupportLibraries_jll 2 CompilerSupportLibraries_jll
0.5 CompositeTypes 0.5 CompositeTypes
0.1 CompositionsBase 0.2 CompositionsBase
0.1 CompositionsBase → CompositionsBaseInverseFunctionsExt 0.1 CompositionsBase → CompositionsBaseInverseFunctionsExt
0.3 ConcreteStructs 0.2 ConcreteStructs
0.2 ConstructionBase 0.3 ConstructionBase
0.3 ConstructionBase → ConstructionBaseIntervalSetsExt 0.2 ConstructionBase → ConstructionBaseIntervalSetsExt
0.2 ConstructionBase → ConstructionBaseLinearAlgebraExt 0.2 ConstructionBase → ConstructionBaseLinearAlgebraExt
0.5 ConstructionBase → ConstructionBaseStaticArraysExt 0.3 ConstructionBase → ConstructionBaseStaticArraysExt
0.8 CpuId 0.5 CpuId
39.3 CPUSummary 94.08% compilation time (84% recompilation) 10.2 CPUSummary 62.13% compilation time
2.9 Crayons 6.3 Crayons
0.3 DataAPI 0.4 DataAPI
33.4 DataStructures 11.6 DataStructures
0.1 DataValueInterfaces 0.1 DataValueInterfaces
34.8 Dates 34.8
2 DiffEqBase 2 DiffEqBase
0.3 DiffEqBase → DiffEqBaseChainRulesCoreExt 0.2 DiffEqBase → DiffEqBaseChainRulesCoreExt
0.3 DiffEqBase → DiffEqBaseDistributionsExt 0.2 DiffEqBase → DiffEqBaseDistributionsExt
1.2 DiffEqBase → DiffEqBaseForwardDiffExt 1.4 DiffEqBase → DiffEqBaseForwardDiffExt
0.2 DiffEqBase → DiffEqBaseSparseArraysExt 0.2 DiffEqBase → DiffEqBaseSparseArraysExt
0.4 DiffEqBase → DiffEqBaseUnitfulExt 0.4 DiffEqBase → DiffEqBaseUnitfulExt
6.8 DiffEqCallbacks 1.7 DiffEqCallbacks
2.9 DiffEqNoiseProcess 2.7 DiffEqNoiseProcess
3.9 DifferentiationInterface 0.2 DifferentiationInterface → DifferentiationInterfaceChainRulesCoreExt
0.2 DifferentiationInterface → DifferentiationInterfaceChainRulesCoreExt 0.5 DifferentiationInterface → DifferentiationInterfaceFiniteDiffExt
0.6 DifferentiationInterface → DifferentiationInterfaceFiniteDiffExt 1.1 DifferentiationInterface → DifferentiationInterfaceForwardDiffExt
1.4 DifferentiationInterface → DifferentiationInterfaceForwardDiffExt 0.2 DifferentiationInterface → DifferentiationInterfaceGPUArraysCoreExt
0.2 DifferentiationInterface → DifferentiationInterfaceGPUArraysCoreExt 0.1 DifferentiationInterface → DifferentiationInterfaceSparseArraysExt
0.2 DifferentiationInterface → DifferentiationInterfaceSparseArraysExt 0.8 DifferentiationInterface → DifferentiationInterfaceSparseMatrixColoringsExt
1 DifferentiationInterface → DifferentiationInterfaceSparseMatrixColoringsExt 0.2 DifferentiationInterface → DifferentiationInterfaceStaticArraysExt
0.2 DifferentiationInterface → DifferentiationInterfaceStaticArraysExt 0.6 DifferentiationInterface → DifferentiationInterfaceSymbolicsExt
0.6 DifferentiationInterface → DifferentiationInterfaceSymbolicsExt 9.5 DifferentiationInterface 59.64% compilation time (100% recompilation)
2.3 DiffResults 0.6 DiffResults
0.8 DiffRules 0.5 DiffRules
7.3 DispatchDoctor 1.8 DispatchDoctor
0.4 DispatchDoctor → DispatchDoctorChainRulesCoreExt 0.2 DispatchDoctor → DispatchDoctorChainRulesCoreExt
0.3 DispatchDoctor → DispatchDoctorEnzymeCoreExt 0.3 DispatchDoctor → DispatchDoctorEnzymeCoreExt
22.9 Distributed 56.89% compilation time 21.2 Distributed 63.13% compilation time
70 Distributions 0.5 Distributions → DistributionsChainRulesCoreExt
0.6 Distributions → DistributionsChainRulesCoreExt 0.2 Distributions → DistributionsTestExt
0.7 Distributions → DistributionsTestExt 86.5 Distributions 6.65% compilation time (100% recompilation)
1 DocStringExtensions 75.5 DocStringExtensions 97.80% compilation time
38.7 DomainSets 19.7 DomainSets
68.5 Downloads 68.5
10.1 DynamicPolynomials 5.5 DynamicPolynomials
411.7 DynamicQuantities 158.8 DynamicQuantities
21.4 DynamicQuantities → DynamicQuantitiesLinearAlgebraExt 11.1 DynamicQuantities → DynamicQuantitiesLinearAlgebraExt
2.2 DynamicQuantities → DynamicQuantitiesUnitfulExt 1.4 DynamicQuantities → DynamicQuantitiesUnitfulExt
0.5 EnumX 0.2 EnumX
3.4 EnzymeCore 1.3 EnzymeCore
0.1 EnzymeCore → AdaptExt 0.1 EnzymeCore → AdaptExt
3.4 ExproniconLite 5.2 ExproniconLite
0.3 ExprTools 0.3 ExprTools
1.2 FastBroadcast 1.3 FastBroadcast
0.2 FastClosures 0.2 FastClosures
0.1 FastPower 0.1 FastPower
0.1 FastPower → FastPowerForwardDiffExt 0.1 FastPower → FastPowerForwardDiffExt
54.9 FillArrays 38.7 FillArrays
0.2 FillArrays → FillArraysPDMatsExt 0.2 FillArrays → FillArraysPDMatsExt
1.9 FillArrays → FillArraysSparseArraysExt 1.5 FillArrays → FillArraysSparseArraysExt
0.3 FillArrays → FillArraysStatisticsExt 0.2 FillArrays → FillArraysStatisticsExt
0.3 FindFirstFunctions 0.4 FindFirstFunctions
1 FiniteDiff 1.1 FiniteDiff
0.3 FiniteDiff → FiniteDiffSparseArraysExt 0.1 FiniteDiff → FiniteDiffSparseArraysExt
0.2 FiniteDiff → FiniteDiffStaticArraysExt 0.2 FiniteDiff → FiniteDiffStaticArraysExt
4.2 Format 3.1 Format
66.6 ForwardDiff 23.9 ForwardDiff
0.6 ForwardDiff → ForwardDiffStaticArraysExt 0.4 ForwardDiff → ForwardDiffStaticArraysExt
4.9 FunctionWrappers 4.4 FunctionWrappers
0.2 FunctionWrappersWrappers 0.2 FunctionWrappersWrappers
1.6 Functors 1.1 Functors
0.1 Future 0.1 Future
1.6 Glob 0.5 Glob
0.4 GPUArraysCore 0.3 GPUArraysCore
16.9 Graphs 9.2 Graphs
2.6 HypergeometricFunctions 0.7 HypergeometricFunctions
0.1 IfElse 0.1 IfElse
0.8 ImplicitDiscreteSolve 0.5 ImplicitDiscreteSolve
0.3 Inflate 0.3 Inflate
0.2 IntegerMathUtils 0.2 IntegerMathUtils
1085.1 IntelOpenMP_jll 99.93% compilation time 1085.1
8 IntervalSets 5.1 IntervalSets
0.2 IntervalSets → IntervalSetsRandomExt 0.2 IntervalSets → IntervalSetsRandomExt
0.2 IntervalSets → IntervalSetsRecipesBaseExt 0.2 IntervalSets → IntervalSetsRecipesBaseExt
0.1 IntervalSets → IntervalSetsStatisticsExt 0.1 IntervalSets → IntervalSetsStatisticsExt
0.3 InverseFunctions 0.1 InverseFunctions → InverseFunctionsDatesExt
0.1 InverseFunctions → InverseFunctionsDatesExt 0.1 InverseFunctions → InverseFunctionsTestExt
0.2 InverseFunctions → InverseFunctionsTestExt 18.7 InverseFunctions 94.80% compilation time (100% recompilation)
12.3 IrrationalConstants 5 IrrationalConstants
0.1 IteratorInterfaceExtensions 0.1 IteratorInterfaceExtensions
3.5 Jieko 31.2 Jieko
0.4 JLLWrappers 0.4
34.3 JuliaFormatter 55.3 JuliaFormatter
22.8 JuliaSyntax 81.8 JuliaSyntax
12.2 JumpProcesses 5.5 JumpProcesses
22.3 Krylov 9.8 Krylov
8.6 Latexify 9.2 Latexify
0.2 Latexify → SparseArraysExt 0.2 Latexify → SparseArraysExt
1 LaTeXStrings 0.3 LaTeXStrings
1.7 LayoutPointers 1.4 LayoutPointers
65.5 LazyArrays 184.8 LazyArrays
25.2 LazyArrays → LazyArraysBlockArraysExt 10.4 LazyArrays → LazyArraysBlockArraysExt
0.2 LazyArrays → LazyArraysStaticArraysExt 0.2 LazyArrays → LazyArraysStaticArraysExt
0.3 LazyArtifacts 0.3
1.4 LibCURL 1.4
0.3 LibCURL_jll 0.3
23.2 LibGit2 23.2
0.3 LibGit2_jll 0.3
0.3 LibSSH2_jll 0.3
19.4 LinearSolve 40.8 LinearSolve
0.6 LinearSolve → LinearSolveEnzymeExt 0.5 LinearSolve → LinearSolveEnzymeExt
4.5 LinearSolve → LinearSolveForwardDiffExt 2 LinearSolve → LinearSolveForwardDiffExt
28 LinearSolve → LinearSolveSparseArraysExt 23.7 LinearSolve → LinearSolveSparseArraysExt
1.9 LineSearch 2.5 LineSearch
0.4 LineSearch → LineSearchLineSearchesExt 0.5 LineSearch → LineSearchLineSearchesExt
6 LineSearches 1.3 LineSearches
0.5 LogExpFunctions 0.3 LogExpFunctions
0.7 LogExpFunctions → LogExpFunctionsChainRulesCoreExt 0.3 LogExpFunctions → LogExpFunctionsChainRulesCoreExt
0.3 LogExpFunctions → LogExpFunctionsInverseFunctionsExt 0.2 LogExpFunctions → LogExpFunctionsInverseFunctionsExt
0.1 Logging 0.1
3.7 MacroTools 5.9 MacroTools
0.7 ManualMemory 0.6 ManualMemory
0.7 MaybeInplace 0.6 MaybeInplace
0.2 MaybeInplace → MaybeInplaceSparseArraysExt 0.2 MaybeInplace → MaybeInplaceSparseArraysExt
5.1 Missings 2.9 Missings
1.4 MKL_jll 1.4 MKL_jll
51.6 MLStyle 61.9 MLStyle
0.3 Mmap 0.3 Mmap
878.3 ModelingToolkit 1023.9 ModelingToolkit
149.8 Moshi 35.9 Moshi
0.1 MozillaCACerts_jll
0.2 MuladdMacro 0.2 MuladdMacro 0.1
41.9 MultivariatePolynomials 16.1 MultivariatePolynomials
145.9 MutableArithmetics 90.8 MutableArithmetics
0.3 NaNMath 0.2 NaNMath
0.6 NetworkOptions 0.6
0.3 nghttp2_jll 0.3
5.9 NLSolversBase 2 NLSolversBase
49.4 NonlinearSolve 70.7 NonlinearSolve
7.5 NonlinearSolveBase 4.3 NonlinearSolveBase
0.2 NonlinearSolveBase → NonlinearSolveBaseDiffEqBaseExt 0.2 NonlinearSolveBase → NonlinearSolveBaseDiffEqBaseExt
0.4 NonlinearSolveBase → NonlinearSolveBaseForwardDiffExt 0.3 NonlinearSolveBase → NonlinearSolveBaseForwardDiffExt
0.2 NonlinearSolveBase → NonlinearSolveBaseLinearSolveExt 0.2 NonlinearSolveBase → NonlinearSolveBaseLinearSolveExt
0.3 NonlinearSolveBase → NonlinearSolveBaseLineSearchExt 0.2 NonlinearSolveBase → NonlinearSolveBaseLineSearchExt
0.2 NonlinearSolveBase → NonlinearSolveBaseSparseArraysExt 0.2 NonlinearSolveBase → NonlinearSolveBaseSparseArraysExt
2.1 NonlinearSolveBase → NonlinearSolveBaseSparseMatrixColoringsExt 0.3 NonlinearSolveBase → NonlinearSolveBaseSparseMatrixColoringsExt
179.7 NonlinearSolveFirstOrder 215.1 NonlinearSolveFirstOrder
71.5 NonlinearSolveQuasiNewton 70.7 NonlinearSolveQuasiNewton
0.7 NonlinearSolveQuasiNewton → NonlinearSolveQuasiNewtonForwardDiffExt 0.7 NonlinearSolveQuasiNewton → NonlinearSolveQuasiNewtonForwardDiffExt
32.8 NonlinearSolveSpectralMethods 31.5 NonlinearSolveSpectralMethods
0.6 NonlinearSolveSpectralMethods → NonlinearSolveSpectralMethodsForwardDiffExt 0.6 NonlinearSolveSpectralMethods → NonlinearSolveSpectralMethodsForwardDiffExt
11.7 OffsetArrays 12.1 OffsetArrays
0.5 OffsetArrays → OffsetArraysAdaptExt 0.3 OffsetArrays → OffsetArraysAdaptExt
99.3 oneTBB_jll 98.85% compilation time (100% recompilation) 147.3 oneTBB_jll 99.22% compilation time (100% recompilation)
0.2 OpenLibm_jll 1.4 OpenLibm_jll
48.4 OpenSpecFun_jll 98.82% compilation time (86% recompilation) 0.3 OpenSpecFun_jll
1 OpenSSL_jll 1
11.7 Optim 4.8 Optim
6 OrderedCollections 1.8 OrderedCollections
12.1 OrdinaryDiffEqCore 25.2 OrdinaryDiffEqCore
0.7 OrdinaryDiffEqCore → OrdinaryDiffEqCoreEnzymeCoreExt 0.5 OrdinaryDiffEqCore → OrdinaryDiffEqCoreEnzymeCoreExt
0.4 p7zip_jll 0.4
0.4 Parameters 0.3 Parameters
12.3 PDMats 6.8 PDMats
172 Pkg 172
0.2 PoissonRandom 0.2 PoissonRandom
1.1 Polyester 0.5 Polyester
5.8 PolyesterWeave 2.6 PolyesterWeave
0.5 PositiveFactorizations 0.3 PositiveFactorizations
0.2 PrecompileTools 0.2 PrecompileTools
0.5 Preferences
31.6 PrettyTables 48 PrettyTables
4.7 Primes 4.5 Primes
1.6 Printf
0.3 PtrArrays 0.3 PtrArrays
2.9 QuadGK 1.9 QuadGK
1.7 Random123 1.5 Random123
5.2 RandomNumbers 8.4 RandomNumbers
2.5 RecipesBase 9.8 RecipesBase
24.3 RecursiveArrayTools 14.5 RecursiveArrayTools
0.2 RecursiveArrayTools → RecursiveArrayToolsFastBroadcastExt 0.2 RecursiveArrayTools → RecursiveArrayToolsFastBroadcastExt
0.2 RecursiveArrayTools → RecursiveArrayToolsForwardDiffExt 0.2 RecursiveArrayTools → RecursiveArrayToolsForwardDiffExt
0.2 RecursiveArrayTools → RecursiveArrayToolsSparseArraysExt 0.3 RecursiveArrayTools → RecursiveArrayToolsSparseArraysExt
0.1 Reexport 0.2 Reexport
0.3 ResettableStacks 0.2 ResettableStacks
0.8 Rmath 1.8 Rmath
0.5 Rmath_jll 0.3 Rmath_jll
0.7 RuntimeGeneratedFunctions 0.4 RuntimeGeneratedFunctions
0.3 SCCNonlinearSolve 0.4 SCCNonlinearSolve
101.8 SciMLBase 0.3 SciMLBase → SciMLBaseChainRulesCoreExt
0.9 SciMLBase → SciMLBaseChainRulesCoreExt 0.4 SciMLBase → SciMLBaseMLStyleExt
0.4 SciMLBase → SciMLBaseMLStyleExt 63.5 SciMLBase 15.94% compilation time (100% recompilation)
1.7 SciMLJacobianOperators 1.1 SciMLJacobianOperators
20 SciMLOperators 7.1 SciMLOperators
0.1 SciMLOperators → SciMLOperatorsSparseArraysExt 0.1 SciMLOperators → SciMLOperatorsSparseArraysExt
0.2 SciMLOperators → SciMLOperatorsStaticArraysCoreExt 0.2 SciMLOperators → SciMLOperatorsStaticArraysCoreExt
0.5 SciMLPublic 0.4 SciMLPublic
0.3 SciMLStructures 0.3 SciMLStructures
0.7 Serialization 0.6 Serialization
6.9 Setfield 4.7 Setfield
4.6 SharedArrays 1.9 SharedArrays
0.2 SIMDTypes 0.2 SIMDTypes
17 SimpleNonlinearSolve 38 SimpleNonlinearSolve
0.2 SimpleNonlinearSolve → SimpleNonlinearSolveChainRulesCoreExt 0.2 SimpleNonlinearSolve → SimpleNonlinearSolveChainRulesCoreExt
0.2 SimpleNonlinearSolve → SimpleNonlinearSolveDiffEqBaseExt 0.2 SimpleNonlinearSolve → SimpleNonlinearSolveDiffEqBaseExt
0.6 SimpleTraits 0.3 SimpleTraits
0.2 SimpleUnPack 0.2 SimpleUnPack
0.5 SortingAlgorithms 0.5 SortingAlgorith
143.3 SparseArrays 113.3 SparseArrays 4.44% compilation time
13.9 SparseMatrixColorings 20.4 SparseMatrixColorings
39.2 SpecialFunctions 4.2 SpecialFunctions
2.4 SpecialFunctions → SpecialFunctionsChainRulesCoreExt 0.5 SpecialFunctions → SpecialFunctionsChainRulesCoreExt
38 Static 13.2 Static
20.8 StaticArrayInterface 2.7 StaticArrayInterface
1.2 StaticArrayInterface → StaticArrayInterfaceOffsetArraysExt 0.5 StaticArrayInterface → StaticArrayInterfaceOffsetArraysExt
3.1 StaticArrayInterface → StaticArrayInterfaceStaticArraysExt 0.8 StaticArrayInterface → StaticArrayInterfaceStaticArraysExt
100.8 StaticArrays 99.9 StaticArrays
0.3 StaticArrays → StaticArraysChainRulesCoreExt 0.2 StaticArrays → StaticArraysChainRulesCoreExt
0.2 StaticArrays → StaticArraysStatisticsExt 0.2 StaticArrays → StaticArraysStatisticsExt
1 StaticArraysCore 0.4 StaticArraysCore
0.9 Statistics 0.6 Statistics
0.2 Statistics → SparseArraysExt 0.1 Statistics → SparseArraysExt
0.3 StatsAPI 0.3 StatsAPI
12.2 StatsBase 8.6 StatsBase
1.8 StatsFuns 2.7 StatsFuns
0.5 StatsFuns → StatsFunsChainRulesCoreExt 0.2 StatsFuns → StatsFunsChainRulesCoreExt
0.2 StatsFuns → StatsFunsInverseFunctionsExt 0.2 StatsFuns → StatsFunsInverseFunctionsExt
51.3 StrideArraysCore 7.4 StrideArraysCore
1.3 StringManipulation 4.4 StringManipulation
0.2 SuiteSparse 0.2 SuiteSparse
0.9 SuiteSparse_jll 2.4 SuiteSparse_jll
3.2 SymbolicIndexingInterface 2.4 SymbolicIndexingInterface
2.7 SymbolicLimits 0.4 SymbolicLimits
143.7 Symbolics 79.8 Symbolics
3.5 Symbolics → SymbolicsForwardDiffExt 8 Symbolics → SymbolicsForwardDiffExt
90.8 SymbolicUtils 78.7 SymbolicUtils
14.4 Tables 5.5 Tables
0.1 TableTraits 0.1 TableTraits
2.7 Tar 2.7
0.3 TaskLocalValues 0.3 TaskLocalValues
0.2 TermInterface 0.1 TermInterface
16.7 Test 18.9 Test
0.2 TestItems 0.1 TestIte
0.7 ThreadingUtilities 3.8 ThreadingUtilities
5.4 TimerOutputs 11.8 TimerOutputs
0.5 TOML 0.5
0.2 TruncatedStacktraces 0.1 TruncatedStacktraces
107.8 Unitful 95.2 Unitful
0.1 Unitful → ConstructionBaseUnitfulExt 0.1 Unitful → ConstructionBaseUnitfulExt
0.4 Unitful → ForwardDiffExt 0.3 Unitful → ForwardDiffExt
0.2 Unitful → InverseFunctionsUnitfulExt 0.1 Unitful → InverseFunctionsUnitfulExt
0.6 Unitful → PrintfExt 0.4 Unitful → PrintfExt
0.9 Unityper 0.2 Unityper
0.1 UnPack 0.1 UnPack
4.1 URIs 1.9 URIs
0.1 UUIDs 0.1
1.1 WeakValueDicts 0.4 WeakValueDicts
0.2 Zlib_jll 0.2
Total extra packages 1400.3

Interesting: 1401ms of the extra load time comes from extra packages that get loaded when using Julia 1.12, compared to using Julia 1.11.

The largest contributor is IntelOpenMP_jll with more than 1s load time (not getting loaded when using Julia 1.11).

ufechner7 avatar Jul 08 '25 13:07 ufechner7

The following packages get loaded with Julia 1.12, but not with Julia 1.11:

  • ArgTools
  • Dates
  • Downloads
  • IntelOpenMP
  • JLLWrappers
  • LazyArtifacts
  • LibCURL
  • LibCURL_jll
  • LibGit2
  • LibGit2_jll
  • LibSSH2_jll
  • Logging
  • MozillaCACerts_jll
  • NetworkOptions
  • nghttp2_jll
  • OpenSSL_jll
  • p7zip_jll
  • Pkg

Any idea why?

ufechner7 avatar Jul 08 '25 13:07 ufechner7

@ufechner7 I believe it's because Pkg moved out of the sysimage. There are a lot of packages that depend on Pkg for bad reasons.

oscardssmith avatar Jul 08 '25 14:07 oscardssmith

And why is IntelOpenMP_jll loaded with 1.12 and not with 1.11? It has a very long load time due to re-compilation.

(@v1.12) pkg> why IntelOpenMP_jll
  IntelOpenMP_jll
  ModelingToolkit → NonlinearSolve → LinearSolve → MKL_jll → IntelOpenMP_jll
  ModelingToolkit → NonlinearSolve → NonlinearSolveFirstOrder → LinearSolve → MKL_jll → IntelOpenMP_jll
  ModelingToolkit → NonlinearSolve → NonlinearSolveQuasiNewton → LinearSolve → MKL_jll → IntelOpenMP_jll

ufechner7 avatar Jul 08 '25 14:07 ufechner7

I believe it's because Pkg moved out of the sysimage.

Pkg is not in the sysimage in 1.11 either.

KristofferC avatar Jul 08 '25 18:07 KristofferC

And why is IntelOpenMP_jll loaded with 1.12 and not with 1.11?

I don't think that is true, I see that they get loaded on both 1.12 and 1.11.

julia> @time using ModelingToolkit
  5.438113 seconds (16.04 M allocations: 934.729 MiB, 11.55% gc time, 21.06% compilation time: 27% of which was recompilation)

julia> @time using ModelingToolkit
  3.882277 seconds (6.22 M allocations: 390.898 MiB, 9.52% gc time, 6.70% compilation time: 66% of which was recompilation)

This is what I get from @time_imports (sorted on the biggest absolute diff in load time in ms and not showing packages with very small load time):

Package v1.11 v1.12 Diff
IntelOpenMP_jll 133.6 920.9 +787.3 (+589%)
DynamicQuantities 164.1 338.6 +174.5 (+106%)
Symbolics 70.1 243.6 +173.5 (+248%)
BlockArrays 121.5 229.4 +107.9 (+89%)
oneTBB_jll 0.7 91.9 +91.2 (+13029%)
ArrayLayouts 148.4 208.9 +60.5 (+41%)
MutableArithmetics 89.8 144.8 +55.0 (+61%)
SparseArrays 89.7 140.4 +50.7 (+57%)
ForwardDiff 21.0 61.5 +40.5 (+193%)
OpenSpecFun_jll 2.8 42.3 +39.5 (+1411%)
SpecialFunctionsChainRulesCoreExt 0.4 36.0 +35.6 (+8900%)
MultivariatePolynomials 12.3 39.1 +26.8 (+218%)
CPUSummary 9.4 36.0 +26.6 (+283%)
Pkg 185.2 211.3 +26.1 (+14%)
Static 8.8 32.0 +23.2 (+264%)
DataStructures 8.8 30.7 +21.9 (+249%)
DomainSets 15.2 36.8 +21.6 (+142%)
FillArrays 33.2 53.2 +20.0 (+60%)
Dates 11.4 30.2 +18.8 (+165%)
SciMLBase 82.4 99.3 +16.9 (+21%)
StaticArrayInterface 2.2 17.8 +15.6 (+709%)
Distributions 49.2 63.0 +13.8 (+28%)
LazyArraysBlockArraysExt 8.4 19.9 +11.5 (+137%)
SciMLOperators 6.2 16.3 +10.1 (+163%)
Tables 4.0 13.4 +9.4 (+235%)
...
  • Sum of all load times in v1.11: 3739.4 ms
  • Sum of all load times in v1.12: 5299.5 ms
  • Difference in total load time: +1560.1 ms (+41.7%)

Making jlls more robust to invalidations would be one big improvement

Raw data: 1.11.txt 1.12.txt

KristofferC avatar Jul 09 '25 11:07 KristofferC

I did some work on JLL invalidations but that might not have gotten to 1.12

IanButterworth avatar Jul 09 '25 11:07 IanButterworth

You mean https://github.com/JuliaPackaging/JLLWrappers.jl/pull/75? That's not in a release.

giordano avatar Jul 09 '25 11:07 giordano

And https://github.com/JuliaLang/julia/pull/58436 https://github.com/JuliaLang/julia/pull/58473

IanButterworth avatar Jul 09 '25 11:07 IanButterworth

I don't think that has much to do with invalidation causing a 1s load time of a jll.

KristofferC avatar Jul 09 '25 11:07 KristofferC

With https://github.com/JuliaLang/julia/pull/58948 + https://github.com/JuliaLang/julia/pull/58957 on the 1.12 branch I get

julia> VERSION
v"1.11.6"

julia> @time using ModelingToolkit
  3.932297 seconds (6.34 M allocations: 459.370 MiB, 8.66% gc time, 6.75% compilation time: 65% of which was recompilation)
julia> VERSION
v"1.12.0-beta4.88"

julia> @time using ModelingToolkit
  3.297746 seconds (6.86 M allocations: 453.125 MiB, 11.20% gc time, 6.45% compilation time: 13% of which was recompilation)

KristofferC avatar Jul 10 '25 10:07 KristofferC

Closing based on https://github.com/JuliaLang/julia/issues/57436#issuecomment-3056753975.

KristofferC avatar Sep 05 '25 20:09 KristofferC