First, comment out all exports and unit imports and the precompilation include. Also comment out the entirety of the LA extension.
#!/usr/bin/env julia
using Statistics
using Printf
# All 16 files in order
ALL_FILES = [
"internal_utils.jl",
"fixed_rational.jl",
"write_once_read_many.jl",
"types.jl",
"utils.jl",
"math.jl",
"arrays.jl",
"units.jl",
"constants.jl",
"uparse.jl",
"symbolic_dimensions.jl",
"affine_dimensions.jl",
"complex.jl",
"register_units.jl",
"disambiguities.jl",
"deprecated.jl"
]
function modify_src_file(n_files_to_include)
"""Modify src/DynamicQuantities.jl to include only the first n_files_to_include files"""
src_file = "src/DynamicQuantities.jl"
content = read(src_file, String)
# Process each file
for (idx, file) in enumerate(ALL_FILES)
if idx <= n_files_to_include
# Uncomment this file
content = replace(content, " # include(\"$file\")" => " include(\"$file\")")
else
# Comment this file
content = replace(content, " include(\"$file\")" => " # include(\"$file\")")
end
end
write(src_file, content)
end
function run_timing_test(n_trials=40)
"""Run julia import test n_trials+1 times (first is for precompilation)"""
times = Float64[]
# First run for precompilation
run(`julia --project=. --startup-file=no -e "@time using DynamicQuantities"`, wait=true)
# Collect n_trials measurements
for i in 1:n_trials
output = read(`julia --project=. --startup-file=no -e "@time using DynamicQuantities"`, String)
# Parse the time from @time output
m = match(r"([\d.]+)\s+seconds", output)
if m !== nothing
push!(times, parse(Float64, m[1]))
end
end
return times
end
function main()
# Save original state
println("Saving original src/DynamicQuantities.jl state...")
original_content = read("src/DynamicQuantities.jl", String)
# Output file
output_file = "import_times_quartiles_auto.txt"
open(output_file, "w") do io
println(io, "Progressive Import Time Analysis - Quartiles (40 measurements each)")
println(io, "=====================================================================")
println(io, "")
println(io, "Files Included Q25 (ms) Q75 (ms)")
println(io, "--------------------------------------------------------------------")
for n_files in 1:16
# Determine configuration name
if n_files == 1
config_name = "1. internal_utils.jl only"
elseif n_files == 16
config_name = "16. + deprecated.jl (ALL FILES)"
else
config_name = "$(n_files). + $(ALL_FILES[n_files])"
end
print("Testing $config_name...")
flush(stdout)
# Modify the source file
modify_src_file(n_files)
# Run timing tests
times = run_timing_test(40)
if length(times) >= 40
# Calculate quartiles
sort!(times)
q25 = times[10] # 25th percentile of 40 values
q75 = times[30] # 75th percentile of 40 values
# Write to file
config_str = rpad(config_name, 48)
q25_str = @sprintf("%.1f", q25 * 1000)
q75_str = @sprintf("%.1f", q75 * 1000)
println(io, "$config_str $q25_str $q75_str")
println(" Q25: $(round(q25*1000, digits=1))ms, Q75: $(round(q75*1000, digits=1))ms")
else
println(" FAILED - only got $(length(times)) measurements")
end
end
end
# Restore original file
println("\nRestoring original src/DynamicQuantities.jl...")
write("src/DynamicQuantities.jl", original_content)
println("\nResults saved to: $output_file")
end
# Run the script
main()
Here's a breakdown of load time contributors (1.11.6)
internal_utils.jlfixed_rational.jlwrite_once_read_many.jltypes.jlutils.jlmath.jlarrays.jlunits.jlconstants.jluparse.jlsymbolic_dimensions.jlaffine_dimensions.jlcomplex.jlregister_units.jldisambiguities.jldeprecated.jlMeasured by progressively uncommenting one include at a time.
So clearly there are some issues with
utils.jlandarrays.jlthat are blowing up the import time. And also the linear algebra extension which is about 30ms by itself.Code:
First, comment out all exports and unit imports and the precompilation include. Also comment out the entirety of the LA extension.
Then, run: