Loading FixedPointNumbers invalidates ~7,700 precompiled method instances (7x slower first mtkcompile)
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 5/5
- Temps estimé
- Plus d'une semaine
- Accessibilité débutants
- 42/100
- Type d'issue
- Bug
- Clarté
- Plutôt claire
- Activité
- Active
- Stack technique
- julia
- Domaine
- performance
Piste de recherche
Commencez par mwe.jl et les mesures d’invalidation de SnoopCompile, puis examinez les méthodes indiquées dans src/fixed.jl, src/normed.jl et src/FixedPointNumbers.jl. Comparez des signatures plus étroites ou d’autres modifications aux 7 708 invalidations et aux temps de mtkcompile, tout en vérifiant que le comportement de FixedPointNumbers reste correct ; le travail est terminé lorsque l’impact du chargement est réduit sans régressions.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Summary
Loading FixedPointNumbers into a session that already has ModelingToolkit loaded invalidates
7,708 precompiled method instances and makes the first mtkcompile call take 23.59 s
instead of 0.04 s — a huge slowdown in a script that never uses a fixed-point number.
Most users meet this indirectly: ColorTypes/Colors depend on FixedPointNumbers, so any
Makie-based plotting next to ModelingToolkit pays this cost on the first model build.
MWE
# mwe.jl
using ModelingToolkit
using ModelingToolkit: t_nounits as t, D_nounits as D
if get(ENV, "LOAD_FPN", "0") == "1"
@eval using FixedPointNumbers # <-- the only difference
end
@variables x(t)=1.0 y(t)=0.0
@named sys = System([D(x) ~ y, D(y) ~ -x], t)
t0 = time(); mtkcompile(sys); println("mtkcompile: ", round(time()-t0, digits=2), " s")
(test) pkg> st
Status `~/test/Project.toml`
[53c48c17] FixedPointNumbers v0.9.1
[961ee093] ModelingToolkit v11.41.0
$ julia --startup-file=no --project=. mwe.jl
mtkcompile: 0,04 s
$ LOAD_FPN=1 julia --startup-file=no --project=. mwe.jl
mtkcompile: 23.59 s
As a control, loading a package of comparable size that does not add methods to Base
generics (using LaTeXStrings) leaves the time unchanged at 0.04 s, so this is not the
general cost of loading a package.
Attribution
using SnoopCompileCore
using ModelingToolkit
invs = @snoop_invalidations using FixedPointNumbers;
using SnoopCompile
length(uinvalidated(invs)) # 7708, from 15 culprit methods
Ranked by countchildren:
| children | method |
|---|---|
| 14312 | promote_rule(::Type{Fixed{T1,f1}}, ::Type{Fixed{T2,f2}}) where {T1,T2,f1,f2} — src/fixed.jl:199 |
| 3556 | length(r::AbstractUnitRange{N}) where {T<:Unsigned, N<:Normed{T}} — src/normed.jl:304 |
| 3089 | ceil(::Type{Ti}, x::Normed) where Ti<:Integer — src/normed.jl:277 |
| 1668 | showarg(io::IO, a::Array{T}, toplevel) where T<:FixedPoint — src/FixedPointNumbers.jl:279 |
| 403 | reduce_first(::typeof(Base.add_sum), x::FixedPoint) — src/FixedPointNumbers.jl:296 |
| 109 | -(x::X) where X<:FixedPoint — src/FixedPointNumbers.jl:233 |
None of these are type piracy — every one is dispatching on a FixedPointNumbers type. The
cost seems to come from adding methods to widely-inferred Base generics (promote_rule,
length, ceil, convert), which discards inference results in already-loaded packages
that call those generics on non-concrete argument types.
Question
Is there room to narrow any of these signatures, or is this something that has to be fixed
on the consuming side (or in Base)? I am mostly filing this for the record, since the
measured impact is large and I could not find an existing issue about it. Happy to run
further measurements if that helps.
Versions
Julia 1.12.7 (Linux, x86_64), FixedPointNumbers 0.8.6, ModelingToolkit 11.17.0,
SnoopCompile 3.2.9.
- Langage dominant
- Julia
- Étoiles
- 95
- Forks
- 38
- Merge moyen
- 14 h 24 min
- PR mergées (30 j)
- 17
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Aucun modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de JuliaMath/FixedPointNumbers.jl
-
Difficulté 3/5 1-2 jours Accessibilité débutants 55/100
JuliaMath/FixedPointNumbers.jl#364 ·
Les mainteneurs répondent en général sous 1 jour
-
enhancement needs comments
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 12/100
JuliaMath/FixedPointNumbers.jl#353 · 5 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
bug
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 35/100
JuliaMath/FixedPointNumbers.jl#343 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Fallback of `floattype()` for non-concrete typesPeut-être pris Une pull request liée à cette issue est ouverte ou déjà fusionnée. Ouvertebug
Difficulté 3/5 1-2 jours Accessibilité débutants 62/100
JuliaMath/FixedPointNumbers.jl#342 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 4/5 3-5 jours Accessibilité débutants 35/100
JuliaMath/FixedPointNumbers.jl#337 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de JuliaMath/FixedPointNumbers.jl
Issues similaires
-
io
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 72/100
-
docs
Difficulté 1/5 Moins d'une heure Accessibilité débutants 90/100
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
JuliaGPU/GPUArrays.jl#837 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 88/100
Les mainteneurs répondent en général sous 1 jour