Comparing the load times of MTK I get:
4.0s with Julia 1.13.2
3.17s with Julia 1.14+opt
This is a 21% improvement.
The time-to-first-plot (TTFP) with MakieControlPlots shows an even larger improvement:
Julia 1.13.2:
julia> @time @eval (using MakieControlPlots; plotx([1,2,3], rand(3)))
3.389415 seconds (6.05 M allocations: 381.920 MiB, 13.21% gc time, 15.29% compilation time)
Julia 1.14+opt:
julia> @time @eval (using MakieControlPlots; plotx([1,2,3], rand(3)))
2.426261 seconds (3.49 M allocations: 286.406 MiB, 14.88% gc time, 9.39% compilation time)
This is a 29% improvement.
Congrats to the developers!
Big shout out to @ianshmean and @kristoffer.carlsson , who have been doing a lot of great work on TTFX.
Out of curiosity, what do you get if you set the env var
JULIA_OBJCACHE=0
before starting Julia?
A little bit slower, but not much:
export JULIA_OBJCACHE=0; julia +1.14+opt
julia> @time @eval (using MakieControlPlots; plotx([1,2,3], rand(3)))
2.544094 seconds (3.49 M allocations: 286.391 MiB, 14.28% gc time, 14.67% compilation time)
compared to 2.39s with objcache.
I run a longer test that creates a new system image with 530 packages. You can use the following script to reproduce the test:
#!/bin/bash -eu
# Clone the julia-1.14 branch of KiteControllers into /tmp/test and use a new, empty Julia depot
# in /tmp, install it with bin/install, create a system image with bin/create_sys_image and
# run examples/autopilot.jl with this image in precompile mode (a 30 s simulation, then the
# plot selected in the menu). Needs a display and at least 30 GB of RAM + swap.
# Use test/test_installation to test the installation without a system image.
rm -rf /tmp/testdepot
mkdir /tmp/testdepot
rm -rf /tmp/test
git clone --depth 1 -b julia-1.14 https://github.com/OpenSourceAWE/KiteControllers.jl /tmp/test
cd /tmp/test
export JULIA_DEPOT_PATH=/tmp/testdepot
bin/install
bin/create_sys_image -y
julia_major=$(julia --startup-file=no -e 'print(VERSION.major, ".", VERSION.minor)')
julia --project -t auto -J "bin/kps-image-${julia_major}.so" \
-e 'using KiteControllers; __PRECOMPILE__ = true; include("examples/autopilot.jl")'
It needs:
on Julia 1.13.2 21m57s
on Julia 1.14-opt 16m46s
Much better, about 24%. Looking forward to the release!
cdawg
October 26, 2026, 8:04pm
6
Based on news.md , appears to be a really exciting release all around!! Great stuff!
@ufechner7 PackageCompiler actually has slowed down a fair bit since 1.11, but there’s some PRs that just went in to regain most of that ground. Worth trying tomorrow’s nightly (once the builds are out)
opened 05:18PM - 25 Oct 26 UTC
Claude:
---
Large sysimage builds are about 2x slower on Julia 1.13 than on 1.… 11, almost all of it in the `--output-o` step that writes the image. A private app with about 450 packages went from 21.6 min on 1.11 to past a 60 min CI timeout on 1.13. Two Julia regressions explain most of it, and with fixes for both, 1.13 is about as fast as 1.11 again.
Incremental sysimage of 468 packages (Makie, Plots, DataFrames, CSV, OrdinaryDiffEq and others), `cpu_target="native"`, PackageCompiler master, 16-core Ryzen 5950X. "Generating code" is the `--output-o` step that writes the image; on 1.13, PackageCompiler's "inferring all methods" step adds about 45 s before it.
| Julia | Generating code | Whole build | Sysimage |
| --- | --- | --- | --- |
| 1.11.9 | not reported¹ | 444, 448, 451 s | 2.25 GB |
| 1.13 (`release-1.13`) | 797, 808, 817 s | 946, 956, 965 s | 2.06 GB |
| 1.13 + JuliaLang/julia#64169 | 567, 575, 584 s | 715, 725, 733 s | 2.06 GB |
| 1.13 + JuliaLang/julia#64169 + JuliaLang/julia#64210 | **343, 345 s** | **487, 488 s** | 2.06 GB |
| 1.14.0-alpha1 | 555, 573, 585 s | 602, 621, 633 s | 1.41 GB |
| master (ec2e7c8aa0) | 542, 552, 557 s | 597, 614, 652 s | 1.41 GB |
| master + JuliaLang/julia#64210 | 496, 502, 516 s | 540, 545, 606 s | 1.43 GB |
| master + JuliaLang/julia#64210 + JuliaLang/julia#64212 | 458, 460, 469 s | 546, 549, 550 s | 1.43 GB |
¹ 1.11 used PackageCompiler 2.2.1, which has no step report.
Samples come from three sessions on Oct 24 and 25, each run in interleaved order. The whole-build times also include a precompile-script step that varies by up to about 50 s between runs, so the "Generating code" column is the better comparison.
### Julia
- JuliaLang/julia#64169 (1.13 only): merging global roots while writing an image was quadratic in image size. 1.14 no longer has this code.
- JuliaLang/julia#64210 (master, backport 1.13 and 1.14): since JuliaLang/julia#56880, `.ji` caches without native code keep source only for inlineable methods. The build process loads packages from such caches, so it inferred about 100k methods again while writing the image. Keeping that source roughly doubles the inferred code in each `--pkgimages=no` cache (Makie: 16.9 to 33.6 MiB on master), making those caches 11 to 27% bigger.
- JuliaLang/julia#64212 (master, backport 1.14): when linking the image, each call to code that isn't being compiled scanned every compiled function for an equivalent. On master with JuliaLang/julia#64210, generating code went from 496 to 516 s to 458 to 469 s.
### PackageCompiler
- #1094: `show_timing=true` report, including the `--output-o` steps and peak memory. Merged.
- #1150: bundle preferences in-process (107 to 213 s per app or library build on CI), warn when a build is short of memory. Merged.
- #1141's infer-once hook: it saves nothing on 1.13 as shipped, and nothing once JuliaLang/julia#64210 is in either, because that change keeps the same source. It can go once JuliaLang/julia#64210 lands.
### Still open
- Master still infers about 3.5x as many methods again while writing the image as 1.13 with both fixes (44k against 12.5k). Its caches save about a third fewer external specializations, mostly small accessors such as `getproperty`, which looks intentional and keeps the image 31% smaller. What gets inferred again is mainly trait constructors on package types that no cache keeps, and `Core.TypeEgal` specializations whose source is dropped. Restoring the external code instances that JuliaLang/julia#63752 reports missing doesn't help: it compiles 43k more methods and the image grows 13%. Details and questions in https://github.com/JuliaLang/julia/issues/63752#issuecomment-6404559159.
- Memory: the `--output-o` process needs about 38 GB for `native` and about 54 GB for three targets at this size, on every version tested.
Written with Claude Code (Claude Opus 5.5).