The October 16, 2026 run puts Goose at 3.51x / 3.54x the speed of idiomatic C++, 1.24x / 1.26x the speed of expert C++, and 1.13x / 1.19x the speed of the best safe Rust rows, under MSVC / clang respectively. These are geometric means over the sixteen benchmarks at their large sizes. Peak-memory ratios are 1.95x, 1.32x and 1.25x in Goose's favor. The full suite was rebuilt and rerun at all three sizes, including the separate JIT measurements.
The source improvement in this refresh is check-free graph
traversal. Both Goose graph rows store vertex IDs as
u32 in dist; CSR also stores prefix offsets as
u32 upto out. Validation happens during construction, and
checkfree fn bfs verifies that none remains in traversal.
The entries are still four bytes, and construction and validation are
still timed. The fresh large CSR times are 699/617 ms, against C++
784/761 and Rust 811: 1.12x/1.23x ahead of matching C++, and 1.16x/1.32x
ahead of Rust. Linked adjacency remains much slower than CSR in every
language. Alternating same-compiler trials against the original Goose
sources measured speedups of 1.21x/1.19x for linked adjacency and
1.08x/1.17x for CSR at the large size (notes.md). These
measure the whole source rewrite; the full-suite table alone does not
isolate a source change from other changes since the previous
report.
Compact representation remains the clearest
advantage. records is 2.02-2.26x faster than Rust
on 3.98x less memory: variable-mode enums pay for each record's own
payload, including inline text. interp is 1.29-1.41x faster
on 2.04x less memory for the same distinction in a tree.
sexp uses 2.43x less memory than the Rust arena and 5.04x
less than the C++ owning nodes. For strlist, distinguish
Goose's owned inline strings from the borrowing
string_view, flat-offset and
Vec<&str> rows; those have different lifetime
requirements.
Losses and near-ties remain. calc takes
481/491 ms against the Rust arena's 436 ms. lru takes
2,760/2,068 ms against Rust's 2,249, so it loses under MSVC and wins
under clang. scene is 460/371 ms against Rust 379, again a
loss under MSVC and approximately level under clang. This refresh
measures these differences; it does not re-establish the older
diagnostic claims about which individual compiler mechanisms caused
them.
A check-free kernel can still be limited by backend
optimization. The flat blur is now explicitly
checkfree and takes 952/266 ms. The row-slice form, also
checkfree including slice construction, takes 298/269 ms.
Rust's two forms take 299-300 ms. Removing bounds checks therefore does
not by itself close the MSVC flat-kernel gap. The scene composition and
recursive update also carry checkfree contracts. The
fastest particle rows are nearly level across Goose, Rust and clang C++;
small differences are not evidence of a language advantage on this flat
numeric workload.
Allocation and interfaces matter to the comparison.
bintrees takes 206/204 ms, against C++'s arena at 393/407
and Rust's arena at 235. The per-node allocation rows exceed three
seconds. Goose uses typed references into growing storage where the safe
Rust arena rows use integer indices. In respond, the inline
Goose DTO takes 507/491 ms against Rust's DTO at 1,338, while Goose
streaming takes 454/400 against Rust streaming at 540. Compare matching
interfaces when deciding which result applies to an application.
Read the aggregate with the row-level controls. It
selects the fastest Goose implementation separately for each backend and
comparison tier; memory independently selects the smallest
implementation. Thus graph speed uses CSR while its memory
figure uses linked adjacency, and words speed uses the
hand-written table while memory uses dictionary. The
respond headline uses streaming, and blur uses
row slices under MSVC and flat indexing under clang. These are not the
resource profiles of a single implementation. words also
compares different hash functions and table policies; the Goose
dictionary uses less memory than its hand-written table but runs more
slowly.
These are whole-process measurements on one machine.
They include input generation, construction and teardown, use the best
of three runs after two warm-ups, and do not pin cores. Treat small
differences cautiously, especially in cache-sensitive graph and LRU
workloads. The empty-process floor is now 13.1 ms for Goose and 13.8 ms
for C++, versus about 8 ms in the October 10 report, and MSVC has
changed from 19.51.36257 to 19.51.36260. Cross-date timing changes
cannot be attributed solely to Goose compiler improvements. The older
diagnostic studies are retained, explicitly marked historical, in
notes.md; current comparisons come from the fresh
tables.
Goose