Compile bench

Precompile time, load time, CLI wall time, the size of src/**/*.jl, and the host. DistSSHKit, DistSSHQueue, and DistSSHRun each keep their own record. The scripts live in that repo at bench/compile/.

The numbers that last are on the bench-data branch. The README on that branch is a window of the latest 12 samples per Julia slot. The files under history/ are the archive. Nothing in the job deletes an old file.

PackageArchive
DistSSHKitbench-data
DistSSHQueuebench-data
DistSSHRunbench-data

When the job runs is in that repo's CONTRIBUTING.md, under Scheduled CI. A run on main appends a sample. A render job then rebuilds the README and bench.html from the history already on bench-data, and copies bench.html to the root of gh-pages. GitHub Pages serves that file as HTML. A main push that changes bench/compile/report.jl or bench/compile/charts.jl does the same and does not measure. A pull request that changes that file renders the history into the job summary and does not push. Every run uploads the sample as an artifact. A ref other than main does not push. A command that exits nonzero stops the run before a sample is written. A 1.13 failure on main opens an issue titled Compile bench failed, with the alert label. A later 1.13 success on main closes it. A skipped run, including a Project.toml push that is not a version cut, does not close it. The 1.14-nightly and nightly slots stay out of that issue.

git clone --branch bench-data --single-branch \
  https://github.com/yamanori99/DistSSHKit.jl.git kit-bench-data

From a package checkout, measure and render without pushing:

./bench/compile/measure.sh --slot local --history kit-bench-data/history
./bench/compile/render.sh --history kit-bench-data/history

measure.sh writes a toml under history/<slot>/. render.sh rewrites README.md and bench.html next to that history directory. Neither command commits.

Files

history/<slot>/<YYYY-MM-DD>-<shortsha>.toml
README.md
bench.html

<slot> is the CI name, such as 1.13, 1.14-nightly, or nightly. The name moves when the CI slot moves. Each file stores julia and julia_commit, so a later slot can still be lined up with an earlier one.

The file name is the UTC date and the first 7 characters of the commit. Two runs of the same commit on the same UTC date keep the later file. Sort by the time field inside the file, not by the file name alone, when two samples share a date.

Fields

FieldMeaning
timeUTC time the sample was written (YYYY-MM-DDTHH:MM:SSZ)
repoPackage name
versionProject.toml version
commitFull git commit
slotCI Julia slot
julia, julia_commitThe Julia that ran the sample
osKernel name (Linux, Darwin)
os_nameOS name and version. Older files may omit this
archx86_64 or aarch64. Older files may omit this
cpu, threadsRunner CPU
src_files, src_linessrc/**/*.jl file count and physical lines
src_code_linesThose lines with blanks dropped
src_bytesBytes of those files
precompile_full_secPkg.precompile of the fresh depot
precompile_pkg_secBase.compilecache of this package alone
using_secWall time of using
imports@time_imports rows whose name starts with DistSSH
commandsOne row per CLI command in bench/compile/commands.toml

A command row has name, args, exit, wall_sec (median of three runs), walls_sec, total_ms, main_ms, count, buckets, and top (the 20 slowest methods, still used for the flag). Newer Kit samples also store methods (every specialization of this package, plus any other specialization of at least 200 ms that is not Main) and missed (source functions the command did not compile). Older files have only top. DistSSHQueue records help, status, submit, watch, and cancel. DistSSHKit records help, status, go, and drive. DistSSHRun records help, go, and drive.

Reading a long series

Keep samples with the same os_name and arch in one series. A host change moves the times without a code change. cpu is there for the same reason: GitHub changes the runner image.

code lines is the size to set next to a time jump. src_lines still counts blank lines.

The README flags the latest sample against the previous one on the same slot when the host OS or arch changes, package precompile grows by 1.5x and 0.5s, a command wall grows by 1.5x and 1s, or a method of at least 200 ms is new in the top 20 or doubles. The flag does not fail CI. A jump against a sample from months ago is a question for the files, not for that flag.

bench.html draws the method times and every command's wall time. A time is a specialization that command compiled. A blank time is a function on the package module that the trace never named. The page is not every method under src/. Each function is one name, so a method that did not compile stays off the page when another method of that function did. The README keeps the latest 12 rows and the link to that page. The public link is GitHub Pages (https://yamanori99.github.io/DistSSHKit.jl/bench.html). jsDelivr serves .html as plain text, so the page is not linked from there. A method missing from an older top list is left out of the line. It is not drawn as zero, and it is not listed as uncompiled.