From 3f4d61bff4365a8ae6695b812d21fe32aebba3ae Mon Sep 17 00:00:00 2001 From: K Pamnany Date: Tue, 17 Feb 2026 21:48:11 +0000 Subject: [PATCH 1/4] Add `jl_fptr_compile_time` metric Counts only the time used to compile Julia method instances. --- src/jitlayers.cpp | 1 + src/threading.c | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/jitlayers.cpp b/src/jitlayers.cpp index 3c90ddf915cde..fa449b6aef657 100644 --- a/src/jitlayers.cpp +++ b/src/jitlayers.cpp @@ -534,6 +534,7 @@ jl_code_instance_t *jl_generate_fptr_impl(jl_method_instance_t *mi JL_PROPAGATES jl_atomic_fetch_add_relaxed(&jl_cumulative_recompile_time, t_comp); } jl_atomic_fetch_add_relaxed(&jl_cumulative_compile_time, t_comp); + jl_atomic_fetch_add_relaxed(&jl_fptr_compile_time, t_comp); } ct->reentrant_timing &= ~1ull; } diff --git a/src/threading.c b/src/threading.c index 875b9f6b8aa57..0254ded69a58c 100644 --- a/src/threading.c +++ b/src/threading.c @@ -51,6 +51,8 @@ JL_DLLEXPORT _Atomic(uint64_t) jl_cumulative_recompile_time = 0; JL_DLLEXPORT _Atomic(uint8_t) jl_task_metrics_enabled = 0; +JL_DLLEXPORT _Atomic(uint64_t) jl_fptr_compile_time = 0; + JL_DLLEXPORT void *jl_get_ptls_states(void) { // mostly deprecated: use current_task instead From fb66dbb587feedaf04e67fb4ca5f5e3df0040dcf Mon Sep 17 00:00:00 2001 From: K Pamnany Date: Thu, 19 Feb 2026 17:53:44 +0000 Subject: [PATCH 2/4] Add accessors --- base/timing.jl | 2 ++ src/jlapi.c | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/base/timing.jl b/base/timing.jl index 64d2a0a6f054e..35c391fd69dd3 100644 --- a/base/timing.jl +++ b/base/timing.jl @@ -75,6 +75,8 @@ function cumulative_compile_time_ns() return comp, recomp end +fptr_compile_time_ns() = ccall(:jl_fptr_compile_time_ns, UInt64, ()) + function cumulative_compile_timing(b::Bool) if b ccall(:jl_cumulative_compile_timing_enable, Cvoid, ()) diff --git a/src/jlapi.c b/src/jlapi.c index 670408d2260fb..8ba48a6bf577f 100644 --- a/src/jlapi.c +++ b/src/jlapi.c @@ -509,6 +509,11 @@ JL_DLLEXPORT uint64_t jl_cumulative_recompile_time_ns(void) return jl_atomic_load_relaxed(&jl_cumulative_recompile_time); } +JL_DLLEXPORT uint64_t jl_fptr_compile_time_ns(void) +{ + return jl_atomic_load_relaxed(&jl_fptr_compile_time); +} + /** * @brief Enable per-task timing. */ From b1f075c3f42a07b67eec335bf5b992f541115796 Mon Sep 17 00:00:00 2001 From: K Pamnany Date: Thu, 19 Feb 2026 18:28:24 +0000 Subject: [PATCH 3/4] Add declaration of the metric so it can accessed anywhere --- src/julia_internal.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/julia_internal.h b/src/julia_internal.h index e03690d4323e6..133fdc457cf56 100644 --- a/src/julia_internal.h +++ b/src/julia_internal.h @@ -307,6 +307,7 @@ static inline uint64_t cycleclock(void) JL_NOTSAFEPOINT extern JL_DLLEXPORT _Atomic(uint8_t) jl_measure_compile_time_enabled; extern JL_DLLEXPORT _Atomic(uint64_t) jl_cumulative_compile_time; extern JL_DLLEXPORT _Atomic(uint64_t) jl_cumulative_recompile_time; +extern JL_DLLEXPORT _Atomic(uint64_t) jl_fptr_compile_time; // Global *atomic* integer controlling *process-wide* task timing. extern JL_DLLEXPORT _Atomic(uint8_t) jl_task_metrics_enabled; From a1ad210eb92bacef6902e41c7ddc2f88f2e4b224 Mon Sep 17 00:00:00 2001 From: K Pamnany Date: Thu, 19 Feb 2026 22:01:38 +0000 Subject: [PATCH 4/4] Add a comment --- base/timing.jl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/base/timing.jl b/base/timing.jl index 35c391fd69dd3..0860f588d8b3c 100644 --- a/base/timing.jl +++ b/base/timing.jl @@ -75,6 +75,8 @@ function cumulative_compile_time_ns() return comp, recomp end +# Time spent JIT-compiling Julia method instances, a subset of +# `cumulative_compile_time_ns` fptr_compile_time_ns() = ccall(:jl_fptr_compile_time_ns, UInt64, ()) function cumulative_compile_timing(b::Bool)