Skip to content

timholy/PkgCacheInspector.jl

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

35 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PkgCacheInspector

Build Status Documentation

This package provides insight about what's stored in Julia's package precompile files. This works only on Julia 1.9 and above, as it targets the new pkgimage format.

Basic usage

Here's a quick demo. It assumes you've already installed and precompiled the Colors package (if not, use Pkg.add("Colors")).

julia> using PkgCacheInspector

julia> info_cachefile("Colors")
Contents of /Users/user/.julia/compiled/v1.9/Colors/NKjaT_1DCqx.ji:
  modules: Any[Colors]
  68 external methods
  1759 new specializations of external methods (Base 50.1%, ColorTypes 29.8%, Base.Broadcast 11.3%, ...)
  361 external methods with new roots
  5115 external targets
  3796 edges
  file size:   4922032 (4.694 MiB)
  Segment sizes (bytes):
  system:      1971024 ( 46.65%)
  isbits:      1998959 ( 47.31%)
  symbols:       13360 (  0.32%)
  tags:          28804 (  0.68%)
  relocations:  213041 (  5.04%)
  gvars:             0 (  0.00%)
  fptrs:             0 (  0.00%)

At the top of the display, you can see a summary of the numbers of various items:

  • external methods: methods added by the package to functions owned by Julia or other packages
  • new specializations of external methods: freshly-compiled specializations of methods that are not internal to this package
  • external methods with new roots: the number of external methods that had their roots table extended
  • external targets: the number of external specializations that the compiled code in this package depends on
  • edges: a list of internal dependencies among compiled specializations in the package

The table of numbers at the end reports the sizes of various segments of the cache file. More detail on these points can be found in the documentation.

The display is just a summary; you can extract the full lists from the return value of info_cachefile.

Note

Your session may be corrupted if you run info_cachefile for a package that had already been loaded into your session. Restarting with a clean session and using info_cachefile before otherwise loading the package is recommended.

Finding duplicated specializations

Two "downstream" packages can force identical specializations of the same "upstream" method. In such cases, there may be opportunities to reduce loading time by moving some of the precompilation upstream. You can detect common specializations with the MethodAnalysis package:

julia> using PkgCacheInspector

julia> cf1 = info_cachefile("ImageCore");

julia> cf2 = info_cachefile("FlameGraphs");

julia> using MethodAnalysis

julia> intersect(methodinstances(cf1), methodinstances(cf2))
Set{Core.MethodInstance} with 30 elements:
  MethodInstance for convert(::Type{Vector{ColorTypes.RGB{FixedPointNumbers.N0f8}}}, ::Vector{ColorTypes.RGB{FixedPoint…
  MethodInstance for getindex(::Base.RefValue{ColorTypes.RGB{FixedPointNumbers.N0f8}})
  ⋮

There are no guarantees that moving precompilation upstream will make a measureable change in load time. Any improvements in load time will likely depend on the complexity and number of the common MethodInstances.