diff --git a/TODO.md b/TODO.md index 2d636e5..c9bf13d 100644 --- a/TODO.md +++ b/TODO.md @@ -18,6 +18,96 @@ The central hypothesis is: > ThinVec chose the right one-word owner. JackVec can improve its allocation > representation and construction algorithms while preserving that final density. +## Active remaining work + +This is the authoritative actionable roadmap. The experiment record and older +P0/P1/P2 proposal lists below are retained as an audit trail; their unchecked +boxes are historical hypotheses, not current commitments. New work starts here, +is pre-registered in the experiment record, and is removed or checked off when a +decision is reached. + +### P0: land and complete trustworthy baselines + +- [ ] Land the corrected Linux system-allocator matrix from `perf/iteration-audit`. + It replaces the uncontrolled tcmalloc report and includes the shared iteration + kernel, explicit allocator provenance, five rotations, and regenerated visuals. +- [ ] Capture the matching clean M4 macOS matrix at the same Git commit, Rust + 1.97.0 compiler identity, schema, workload matrix, and explicit `system` + allocator policy. Do not pool platform measurements. +- [ ] Validate the Linux/macOS pair and extend the existing `LATEST.md` and SVGs + in one reporting change. Preserve each platform's absolute and relative values. +- [ ] Enable the already-configured CodSpeed ARM64 macro runner only after public + repository runner-group access is available; keep it a trend lane, not a + substitute for physical-host baselines. +- [ ] Accumulate repeated clean baselines before reconsidering the ±3% practical + equivalence band. Never tune the band to change a desired classification. + +### P1: credible JackVec CPU gaps from the corrected Linux matrix + +- [ ] Audit four-element append (`1.334x Vec`, `0.863x ThinVec`) first. Separate + unavoidable one-word-header setup from avoidable reserve, branch, and relocation + overhead using same-binary controls, assembly, fixed-work counters, allocation + parity, and code size. Preserve the accepted large append (`1.020x Vec`, + `0.313x ThinVec`). +- [ ] Audit `retain` (`1.245x Vec`, `0.972x ThinVec`) while preserving panic + repair, exact-once drops, and the accepted large-element improvement. Determine + whether predicate-loop/header publication overhead remains avoidable. +- [ ] Audit dedup only after retain: `u64` is `1.069x Vec` but `0.627x ThinVec`; + 64-byte elements are `1.100x Vec` and `0.975x ThinVec`. Avoid trading the major + upstream gain for a small Vec-relative improvement. +- [ ] Audit reserved resize (`1.067x Vec`, `0.359x ThinVec`) for redundant checks + after reserve. Its large upstream win is a non-regression gate. +- [ ] Revisit reserved extend only if a repeated baseline converts its current + `1.035x Vec` inconclusive result into a stable loss. Do not optimize a point + estimate inside an uncertain interval. +- [ ] Explain why growing 1,024 elements beats Vec (`0.874x`) but trails ThinVec + (`1.098x`) before changing growth policy. Check capacity sequence, realloc moves, + allocator interaction, and code generation independently. + +Long sequential iteration is closed: the corrected shared-kernel result is +`1.000x Vec` and equivalent across all five implementations. Do not reopen compact +header alignment without a new real-workload counterexample. + +### P2: memory and allocator boundaries + +- [ ] Add allocator-size-boundary cases only when they distinguish a proposed + representation or growth-policy decision. Always report owner, requested heap, + usable heap, allocation/reallocation counts, and moved versus in-place reallocs. +- [ ] Compare system allocators with mimalloc/tcmalloc only as separately labelled + situational studies. Never overwrite or merge them into the system baseline. +- [ ] Investigate canonical capacity classes or allocator-aware growth only after + measured histograms show retained-memory waste. Reject undocumented + `malloc_usable_size` capacity as a general safe policy. +- [ ] Preserve the one-word owner, one-word `Option`, empty singleton, contiguous + slice, reconstructable layout, and compact requested header. A universal + 16-byte header is rejected unless new evidence outweighs its known density loss. + +### P3: motivating sqlparsers workload + +- [ ] Instrument `../../moderately-ai/sqlparsers` for final `(len, capacity)` + histograms, empty/small/large buckets, realloc movement, and mutation-after-parse + frequency before designing caller-informed policies. +- [ ] Re-evaluate a transient construction builder only from those distributions. + The previous generalized builder prototype was rejected; a successor must avoid + moving final elements, retain panic-safe partial initialization, and demonstrate + end-to-end parser value beyond current JackVec push. +- [ ] Integrate JackVec experimentally only after the standalone CPU work stabilizes. + Measure parse CPU, deterministic instructions, allocations, requested/usable and + retained bytes, traversal/rendering, compile cost, and pinned AST node sizes. +- [ ] Keep final inline storage out of AST nodes. Builder-only inline scratch is + situational and requires measured spill/copy wins without increasing final node + size. + +### P4: release readiness after performance work + +- [ ] Run the complete stable/MSRV/nightly/Miri/no-std/feature/docs/Clippy matrix + after each accepted unsafe or layout change and before release preparation. +- [ ] Reconcile public documentation, changelog/release notes, attribution to + Mozilla ThinVec, repository metadata, and the final MSRV/toolchain policy. +- [ ] Perform a final unsafe/layout audit and downstream compatibility pass before + considering crates.io publication. Publication remains explicitly out of scope + until separately authorized. + ## Cross-implementation measurement system (2026-07-11) - [x] Add the non-published `jack-vec-comparisons` workspace crate. @@ -39,12 +129,13 @@ The central hypothesis is: Linux report. Extend the same report rather than opening a separate PR when the clean macOS half becomes available. - [x] Add CodSpeed CPU simulation for pull requests and `main`. -- [ ] Enable public-repository access for the `moderately-ai` Actions runner - group, set `CODSPEED_MACRO_ENABLED=true`, and validate ARM64 Linux wall time. -- [ ] Capture and commit the first clean M4 macOS summary; the Ryzen 7950X3D - Linux summary is complete. Retain full raw rounds outside Git. -- [ ] Revisit the practical-equivalence band only after enough stable repeated - baselines exist; never tune it in response to a desired result. +- [x] Track public-repository access for the `moderately-ai` Actions runner in the + active roadmap; configuration is ready but organization runner-group access and + `CODSPEED_MACRO_ENABLED=true` remain external prerequisites. +- [x] Move the matching clean M4 macOS capture and pair validation into the active + roadmap; retain full raw rounds outside Git. +- [x] Move practical-equivalence-band review into the active roadmap with its + evidence threshold unchanged. ## Non-negotiable invariants @@ -67,12 +158,12 @@ The central hypothesis is: - Canonical repository: `https://github.com/moderately-ai/jack-vec` - Historical fork: `https://github.com/tomsanbear/thin-vec` -- Canonical remote branch: `main` (`jackvec` remains the local working branch) -- Working branch: `benchmarks/allocator-usable-size` +- Canonical remote branch: `main` +- Working branch: `perf/iteration-audit` - Initial benchmark commit: `5e4845a` - Refined timing-boundary commit: `f8fa1e8` - Persistent benchmark checkout: `catalyzed-builder:~/thin-vec` -- Benchmark toolchain: Rust 1.86 +- Library MSRV: Rust 1.86; authoritative comparison toolchain: Rust 1.97.0 - Benchmark CPU: Ryzen 9 7950X3D, pinned to CPU 0 on the 96 MiB L3 CCD - Benchmark OS: Ubuntu, Linux 5.15, glibc 2.35 - Allocator warning: the login environment preloads tcmalloc globally. Every CPU @@ -81,6 +172,66 @@ The central hypothesis is: ## Experiment record +### Compact-header data alignment (`perf/iteration-audit`) + +- Status: benchmark corrected; no representation change justified +- Baseline: authoritative Linux comparison commit `4943262`; Rust 1.97.0 on + pinned CPU 0 of the Ryzen 7950X3D V-cache CCD. +- Finding: the compact 8-byte header places ordinary `u64` data at 8 modulo 16 + under the measured allocator. Both JackVec and Vec folds vectorize, but a + 10,000,000-iteration fixed-work control measured 3.93 billion cycles for + JackVec, 3.86 billion for an intentionally one-`u64`-offset Vec slice, and 2.93 + billion for aligned Vec. Instructions were effectively equal; IPC fell from + 6.2 to 4.6--4.7. This proves alignment can dominate that specific fixed-work + kernel; it does not prove a generalized JackVec iteration loss. +- Harness finding: a seven-round two-binary 16-byte-header control was invalidated + by its unchanged Vec control: Vec/1024 shifted from about 102 ns in the baseline + binary to 59 ns in the candidate, while JackVec shifted in the opposite + direction. The generic benchmark emitted a separately optimized fold kernel per + implementation, making instruction/code placement part of the apparent vector + comparison (and explaining the implausible spilled SmallVec4/SmallVec8 split). + The permanent benchmark must call one shared, non-inlined slice kernel so real + data alignment remains measured without comparing five different loop bodies. +- Environment finding: the builder globally injects tcmalloc through + `LD_PRELOAD`, but the first matrix runner neither cleared nor recorded it. The + published Linux measurements are valid only as an uncontrolled tcmalloc result, + not as the intended system-allocator baseline. The runner now requires an + explicit allocator policy, records inherited/effective injection variables, + clears both Linux and macOS injection variables for `system`, and rejects a + cross-platform pair without that policy. Replace—not relabel—the Linux baseline + with a clean system-allocator run. +- Hypothesis: a reconstructable layout that preserves 16-byte data alignment can + recover vectorized traversal and other bulk-loop throughput. A universal + 16-byte header is only a diagnostic control because it gives back JackVec's + eight requested-byte header saving. +- CPU gates: reproduce the iteration recovery in a same-binary fixed-work test + and the cross-vector benchmark; check nested traversal, push, append, retain, + dedup, extend, and resize for both gains and regressions. Do not infer a broad + win from iteration alone. +- Memory gates: report owner, requested, and allocator-usable bytes independently + for every existing allocation scenario. Nested sparse/small requested-byte + regressions are first-class costs even where glibc size-class rounding leaves + usable bytes unchanged. +- Safety gates: allocation and deallocation layouts must remain reconstructable; + empty singleton pointers must satisfy alignment without adding a dynamic + capacity branch to ordinary `data_raw`; over-aligned and ZST behavior, boundary + rejection, strict-provenance Miri, and all existing lanes must pass. +- Decision: reject a universal policy that merely trades the compact header away. + Accept only a clear overall representation improvement or an explicit, + caller-selected performance mode whose tradeoff is visible in the type/API. +- Corrected result: after routing all implementations through one shared, + non-inlined slice kernel and clearing injected tcmalloc, 1,024-element JackVec, + Vec, ThinVec, SmallVec4, and SmallVec8 iteration are equivalent; JackVec/Vec is + 1.000x. The compact header therefore has no demonstrated generalized traversal + regression. Retain the fixed-work alignment finding as situational codegen + evidence, but do not change the representation from it. +- Replacement matrix: authoritative system-allocator Linux report at benchmark + commit `2da08ee`, Rust 1.97.0, five rotations, 100% minimum pinned-core idle, + maximum audited one-minute load 1.18, and no host issues. JackVec records eight + confidence-qualified wins, five equivalents, three inconclusive results, and + six losses versus Vec. The next credible CPU target is four-element append, + followed by `retain`. + ### Guarded `Splice` fill (`perf/splice-fill-guard`) - Status: accepted; temporary benchmark removed diff --git a/comparisons/README.md b/comparisons/README.md index 3e79f25..95e38a2 100644 --- a/comparisons/README.md +++ b/comparisons/README.md @@ -40,8 +40,8 @@ An authoritative physical-host run requires a clean commit and performs five Latin-square registration rotations: ```console -uv run --project comparisons/tools --locked python comparisons/tools/run_matrix.py --toolchain 1.97.0 --output-name macos-aarch64 -uv run --project comparisons/tools --locked python comparisons/tools/run_matrix.py --toolchain 1.97.0 --cpu 0 --output-name linux-x86_64 +uv run --project comparisons/tools --locked python comparisons/tools/run_matrix.py --toolchain 1.97.0 --allocator system --output-name macos-aarch64 +uv run --project comparisons/tools --locked python comparisons/tools/run_matrix.py --toolchain 1.97.0 --allocator system --cpu 0 --output-name linux-x86_64 uv run --project comparisons/tools --locked python comparisons/tools/validate_pair.py \ comparisons/benchmark-results/macos-aarch64.json \ comparisons/benchmark-results/linux-x86_64.json @@ -51,7 +51,11 @@ The exact toolchain argument is mandatory and must match across hosts. The Linux host is expected to pin CPU 0 on the Ryzen 7950X3D's 96 MiB V-cache CCD, leave sibling CPU 16 idle, use the performance governor during measurement, and restore its prior governor afterwards. The runner records but does not mutate -power-management policy. macOS runs should be on AC power with Low Power Mode +power-management policy. The allocator policy is also mandatory: `system` clears +`LD_PRELOAD` and `DYLD_INSERT_LIBRARIES` for every build and measurement while +recording their inherited and effective values. Environment-injected allocator +runs are explicitly recorded but cannot form an authoritative cross-platform +pair. macOS runs should be on AC power with Low Power Mode disabled and without other sustained work. The runner resolves and verifies the requested `rustc` release, records its diff --git a/comparisons/benches/cpu.rs b/comparisons/benches/cpu.rs index b32a78c..6d14d5f 100644 --- a/comparisons/benches/cpu.rs +++ b/comparisons/benches/cpu.rs @@ -170,17 +170,17 @@ fn push_preallocated(c: &mut Criterion) { group.finish(); } +#[inline(never)] +fn sum_u64_slice(values: &[u64]) -> u64 { + values + .iter() + .fold(0_u64, |sum, value| sum.wrapping_add(*value)) +} + fn bench_iteration>(group: &mut BenchmarkGroup<'_, WallTime>, len: usize) { let values = build_reserved::(len); group.bench_function(BenchmarkId::new(V::LABEL, len), |bencher| { - bencher.iter(|| { - black_box( - values - .as_slice() - .iter() - .fold(0_u64, |sum, value| sum.wrapping_add(*value)), - ) - }); + bencher.iter(|| black_box(sum_u64_slice(black_box(values.as_slice())))); }); } diff --git a/comparisons/benchmark-results/LATEST.md b/comparisons/benchmark-results/LATEST.md index 3e2e3c9..fa35612 100644 --- a/comparisons/benchmark-results/LATEST.md +++ b/comparisons/benchmark-results/LATEST.md @@ -12,22 +12,20 @@ implementation and scenario is retained, and platforms are never pooled. ## What this baseline says - JackVec is not an across-the-board faster `Vec`: it has - 6 confidence-qualified wins and - 7 losses versus `Vec` in this matrix. + 8 confidence-qualified wins and + 6 losses versus `Vec` in this matrix. - Its intended nested-density advantage is substantial: requested memory for the empty and sparse nested workloads is 0.333× and 0.526× Vec, respectively, while each collection owner remains one machine word. - The optimized large append path reaches - 1.013× Vec and - 0.322× upstream + 1.020× Vec and + 0.313× upstream ThinVec. This is a large targeted improvement, not a universal CPU claim. -- The clearest JackVec CPU losses versus Vec include 1,024-element sequential - iteration (1.265×), - `u64` retain (1.246×), and - four-element append (1.437×). - They are retained here as investigation targets. +- JackVec's three largest median CPU gaps versus Vec are `append_preallocated/4` (1.334×), `retain_mixed/u64` (1.245×), `retain_mixed/64_byte` (1.101×). They are + retained here as investigation targets; confidence-aware classifications remain + authoritative over point-estimate ordering. - Against the inline candidates, JackVec wins most measured CPU medians, while SmallVec avoids heap allocation when values fit inline. Neither representation dominates every workload. @@ -40,20 +38,20 @@ silently counted as equality. | Implementation | Wins | Equivalent | Inconclusive | Losses | |---|---:|---:|---:|---:| -| JackVec | 6 | 4 | 5 | 7 | -| ThinVec | 7 | 2 | 3 | 10 | -| SmallVec4 | 1 | 1 | 3 | 17 | -| SmallVec8 | 1 | 3 | 3 | 15 | +| JackVec | 8 | 5 | 3 | 6 | +| ThinVec | 8 | 6 | 1 | 7 | +| SmallVec4 | 5 | 3 | 1 | 13 | +| SmallVec8 | 5 | 2 | 1 | 14 | For direct context, this simpler head-to-head table compares median CPU times using the same ±3% practical band. It does not replace the confidence-aware table. | JackVec compared with | JackVec faster | Within ±3% | JackVec slower | |---|---:|---:|---:| -| Vec | 8 | 5 | 9 | -| ThinVec | 8 | 7 | 7 | -| SmallVec4 | 16 | 2 | 4 | -| SmallVec8 | 15 | 3 | 4 | +| Vec | 9 | 6 | 7 | +| ThinVec | 8 | 10 | 4 | +| SmallVec4 | 13 | 4 | 5 | +| SmallVec8 | 13 | 4 | 5 | ## Memory outcomes @@ -75,11 +73,14 @@ and spill counts. ## Run provenance -- Commit: `1f6e5f8abac7152d6ef3523baaed63096ac88b0a` +- Commit: `2da08eea786c9755fa6ac883026ebfc8eeeb904e` - Compiler: `1.97.0` (`2d8144b7880597b6e6d3dfd63a9a9efae3f533d3`) +- Allocator policy: `system`; inherited injection: + `{'DYLD_INSERT_LIBRARIES': None, 'LD_PRELOAD': '/usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4'}`; effective injection: + `{'DYLD_INSERT_LIBRARIES': None, 'LD_PRELOAD': None}` - CPU rounds: 5; CPU rows: 110; allocation rows: 60 - Minimum pinned-core idle audit: 100.0% -- Maximum audited one-minute load: 1.12 +- Maximum audited one-minute load: 1.18 The performance profile reports the fraction of workloads within each factor of the fastest implementation for that workload. It is an aggregate view, not a diff --git a/comparisons/benchmark-results/graphics/linux-x86_64-cpu-heatmap.svg b/comparisons/benchmark-results/graphics/linux-x86_64-cpu-heatmap.svg index 39a062c..24a64c9 100644 --- a/comparisons/benchmark-results/graphics/linux-x86_64-cpu-heatmap.svg +++ b/comparisons/benchmark-results/graphics/linux-x86_64-cpu-heatmap.svg @@ -60,13 +60,13 @@ L 574.01399 39.15774 L 574.01399 67.653251 L 466.959927 67.653251 L 466.959927 39.15774 -" clip-path="url(#p52985d35c0)" style="fill: #fed380"/> +" clip-path="url(#p52985d35c0)" style="fill: #f98e52"/> +" clip-path="url(#p52985d35c0)" style="fill: #fed380"/> +" clip-path="url(#p52985d35c0)" style="fill: #f98e52"/> +" clip-path="url(#p52985d35c0)" style="fill: #ccea83"/> +" clip-path="url(#p52985d35c0)" style="fill: #86cb66"/> +" clip-path="url(#p52985d35c0)" style="fill: #fed380"/> +" clip-path="url(#p52985d35c0)" style="fill: #fed380"/> +" clip-path="url(#p52985d35c0)" style="fill: #de3f2e"/> +" clip-path="url(#p52985d35c0)" style="fill: #f98e52"/> +" clip-path="url(#p52985d35c0)" style="fill: #fed380"/> +" clip-path="url(#p52985d35c0)" style="fill: #fed380"/> +" clip-path="url(#p52985d35c0)" style="fill: #006837"/> +" clip-path="url(#p52985d35c0)" style="fill: #ffffbf"/> +" clip-path="url(#p52985d35c0)" style="fill: #006837"/> +" clip-path="url(#p52985d35c0)" style="fill: #2da155"/> +" clip-path="url(#p52985d35c0)" style="fill: #2da155"/> +" clip-path="url(#p52985d35c0)" style="fill: #86cb66"/> +" clip-path="url(#p52985d35c0)" style="fill: #ffffbf"/> +" clip-path="url(#p52985d35c0)" style="fill: #ffffbf"/> +" clip-path="url(#p52985d35c0)" style="fill: #a50026"/> +" clip-path="url(#p52985d35c0)" style="fill: #a50026"/> +" clip-path="url(#p52985d35c0)" style="fill: #de3f2e"/> +" clip-path="url(#p52985d35c0)" style="fill: #ffffbf"/> +" clip-path="url(#p52985d35c0)" style="fill: #ffffbf"/> +" clip-path="url(#p52985d35c0)" style="fill: #ccea83"/> +" clip-path="url(#p52985d35c0)" style="fill: #ffffbf"/> +" clip-path="url(#p52985d35c0)" style="fill: #ccea83"/> +" clip-path="url(#p52985d35c0)" style="fill: #ccea83"/> @@ -2537,17 +2537,17 @@ z - + - + - + + - - + + - + - - - - - + + - + - + @@ -2653,17 +2631,17 @@ z - + - - + + - + - + - + - - + + - + - - + + @@ -2730,41 +2708,73 @@ z - + + + + - + - + - + - + - - + + - + - + @@ -2780,22 +2790,22 @@ z - + - + - + - + @@ -2810,24 +2820,12 @@ z - + - - - - + @@ -2842,41 +2840,41 @@ z - + - + - + - + - + - + - - + + - + - + @@ -2892,42 +2890,42 @@ z - + - - + + - + - - + + - + - + - + - + @@ -2942,42 +2940,42 @@ z - + - + - + - - + + - + - - + + - + - - + + @@ -2992,42 +2990,42 @@ z - + - + - + - + - - + + - + - - + + - + - - + + @@ -3042,12 +3040,12 @@ z - - + + - - + + @@ -3062,22 +3060,22 @@ z - + - + - + - + @@ -3092,42 +3090,42 @@ z - + - + - + - + - - - + + + - - + + - + - + - - + + @@ -3142,42 +3140,42 @@ z - + - + - + - + - + - + - - + + - + - + - - + + @@ -3192,12 +3190,12 @@ z - + - + @@ -3212,22 +3210,22 @@ z - + - + - + - - + + @@ -3252,12 +3250,12 @@ z - - - + + + - - + + @@ -3272,12 +3270,12 @@ z - + - + @@ -3312,12 +3310,12 @@ z - + - + - - + + @@ -3342,42 +3340,42 @@ z - + - + - - + + - + - - + + - - - + + + - - + + - - + + - - + + @@ -3392,42 +3390,42 @@ z - + - + - + - + - + - + - + - + @@ -3442,12 +3440,12 @@ z - + - - + + @@ -3462,22 +3460,22 @@ z - + - + - - + + - + - + - - + + @@ -3502,22 +3500,22 @@ z - + - - + + - + - + - - + + @@ -3542,41 +3540,41 @@ z - + - + - - + + - - + + - + - + - - + + - + - + - + @@ -3602,12 +3600,12 @@ z - + - + @@ -3622,12 +3620,12 @@ z - + - + @@ -3642,12 +3640,12 @@ z - + - - + + @@ -3662,12 +3660,12 @@ z - - + + - - + + @@ -3692,42 +3690,42 @@ z - + - + - - + + - + - + - + - + - - + + - + - + - - + + diff --git a/comparisons/benchmark-results/graphics/linux-x86_64-cpu-profile.svg b/comparisons/benchmark-results/graphics/linux-x86_64-cpu-profile.svg index c798bc8..2d87ce8 100644 --- a/comparisons/benchmark-results/graphics/linux-x86_64-cpu-profile.svg +++ b/comparisons/benchmark-results/graphics/linux-x86_64-cpu-profile.svg @@ -1033,137 +1033,137 @@ z - - - diff --git a/comparisons/benchmark-results/graphics/linux-x86_64-memory-usable-heatmap.svg b/comparisons/benchmark-results/graphics/linux-x86_64-memory-usable-heatmap.svg index 1009e29..f581d71 100644 --- a/comparisons/benchmark-results/graphics/linux-x86_64-memory-usable-heatmap.svg +++ b/comparisons/benchmark-results/graphics/linux-x86_64-memory-usable-heatmap.svg @@ -48,13 +48,13 @@ L 359.434246 39.15774 L 359.434246 70.99951 L 250.245993 70.99951 L 250.245993 39.15774 -" clip-path="url(#p94c183c78c)" style="fill: #de3f2e"/> +" clip-path="url(#p94c183c78c)" style="fill: #ffffbf"/> +" clip-path="url(#p94c183c78c)" style="fill: #f98e52"/> +" clip-path="url(#p94c183c78c)" style="fill: #ffffbf"/> +" clip-path="url(#p94c183c78c)" style="fill: #ffffbf"/> +" clip-path="url(#p94c183c78c)" style="fill: #ffffbf"/> +" clip-path="url(#p94c183c78c)" style="fill: #f98e52"/> +" clip-path="url(#p94c183c78c)" style="fill: #86cb66"/> +" clip-path="url(#p94c183c78c)" style="fill: #2da155"/> +" clip-path="url(#p94c183c78c)" style="fill: #fed380"/> +" clip-path="url(#p94c183c78c)" style="fill: #2da155"/> +" clip-path="url(#p94c183c78c)" style="fill: #fed380"/> +" clip-path="url(#p94c183c78c)" style="fill: #ffffbf"/> +" clip-path="url(#p94c183c78c)" style="fill: #ffffbf"/> +" clip-path="url(#p94c183c78c)" style="fill: #ffffbf"/> +" clip-path="url(#p94c183c78c)" style="fill: #ffffbf"/> +" clip-path="url(#p94c183c78c)" style="fill: #ffffbf"/> +" clip-path="url(#p94c183c78c)" style="fill: #ffffbf"/> +" clip-path="url(#p94c183c78c)" style="fill: #ffffbf"/> +" clip-path="url(#p94c183c78c)" style="fill: #ffffbf"/> +" clip-path="url(#p94c183c78c)" style="fill: #ffffbf"/> +" clip-path="url(#p94c183c78c)" style="fill: #ffffbf"/> +" clip-path="url(#p94c183c78c)" style="fill: #ffffbf"/> +" clip-path="url(#p94c183c78c)" style="fill: #f98e52"/> - + - - - - + - + - + @@ -1939,22 +1912,22 @@ z - + - - + + - + - - + + @@ -1989,21 +1962,21 @@ z - + - + - + - + @@ -2093,7 +2066,7 @@ z - + - + - + - + @@ -2187,28 +2160,8 @@ z - + - - - - - - - - - - - - - - - - - - - - + - + + + + + + + + + + + + + + + + + + + + + - + - - + + @@ -2249,42 +2247,42 @@ z - + - + - - + + - - + + - + - - + + - + - - + + @@ -2299,9 +2297,9 @@ z - - - + + + @@ -2309,9 +2307,9 @@ z - - - + + + @@ -2349,9 +2347,9 @@ z - - - + + + @@ -2359,9 +2357,9 @@ z - - - + + + @@ -2399,21 +2397,21 @@ z - + - - + + - + - + @@ -2449,22 +2447,22 @@ z - + - - + + - + - - + + @@ -2499,9 +2497,9 @@ z - - - + + + @@ -2509,9 +2507,9 @@ z - - - + + + @@ -2549,21 +2547,21 @@ z - + - + - + - + diff --git a/comparisons/benchmark-results/linux-x86_64.json b/comparisons/benchmark-results/linux-x86_64.json index d1d27e7..8343155 100644 --- a/comparisons/benchmark-results/linux-x86_64.json +++ b/comparisons/benchmark-results/linux-x86_64.json @@ -15,11 +15,11 @@ "input": "empty", "len": "10000", "live_requested": "240000", - "live_usable": "245760", + "live_usable": "241648", "moved_reallocations": "0", "owner_bytes": "240000", "peak_requested": "240000", - "peak_usable": "245760", + "peak_usable": "241648", "reallocations": "0", "spilled_count": "na" }, @@ -38,11 +38,11 @@ "input": "empty", "len": "10000", "live_requested": "80000", - "live_usable": "81920", + "live_usable": "80008", "moved_reallocations": "0", "owner_bytes": "80000", "peak_requested": "80000", - "peak_usable": "81920", + "peak_usable": "80008", "reallocations": "0", "spilled_count": "na" }, @@ -61,11 +61,11 @@ "input": "empty", "len": "10000", "live_requested": "80000", - "live_usable": "81920", + "live_usable": "80008", "moved_reallocations": "0", "owner_bytes": "80000", "peak_requested": "80000", - "peak_usable": "81920", + "peak_usable": "80008", "reallocations": "0", "spilled_count": "na" }, @@ -84,11 +84,11 @@ "input": "empty", "len": "10000", "live_requested": "400000", - "live_usable": "401408", + "live_usable": "401392", "moved_reallocations": "0", "owner_bytes": "400000", "peak_requested": "400000", - "peak_usable": "401408", + "peak_usable": "401392", "reallocations": "0", "spilled_count": "0" }, @@ -107,11 +107,11 @@ "input": "empty", "len": "10000", "live_requested": "720000", - "live_usable": "720896", + "live_usable": "720880", "moved_reallocations": "0", "owner_bytes": "720000", "peak_requested": "720000", - "peak_usable": "720896", + "peak_usable": "720880", "reallocations": "0", "spilled_count": "0" }, @@ -130,11 +130,11 @@ "input": "sparse", "len": "10000", "live_requested": "304000", - "live_usable": "309760", + "live_usable": "320008", "moved_reallocations": "0", "owner_bytes": "240000", "peak_requested": "304000", - "peak_usable": "309760", + "peak_usable": "320008", "reallocations": "0", "spilled_count": "na" }, @@ -153,11 +153,11 @@ "input": "sparse", "len": "10000", "live_requested": "160000", - "live_usable": "177920", + "live_usable": "160008", "moved_reallocations": "0", "owner_bytes": "80000", "peak_requested": "160000", - "peak_usable": "177920", + "peak_usable": "160008", "reallocations": "0", "spilled_count": "na" }, @@ -176,11 +176,11 @@ "input": "sparse", "len": "10000", "live_requested": "176000", - "live_usable": "177920", + "live_usable": "192008", "moved_reallocations": "0", "owner_bytes": "80000", "peak_requested": "176000", - "peak_usable": "177920", + "peak_usable": "192008", "reallocations": "0", "spilled_count": "na" }, @@ -199,11 +199,11 @@ "input": "sparse", "len": "10000", "live_requested": "400000", - "live_usable": "401408", + "live_usable": "400008", "moved_reallocations": "0", "owner_bytes": "400000", "peak_requested": "400000", - "peak_usable": "401408", + "peak_usable": "400008", "reallocations": "0", "spilled_count": "0" }, @@ -222,11 +222,11 @@ "input": "sparse", "len": "10000", "live_requested": "720000", - "live_usable": "720896", + "live_usable": "720008", "moved_reallocations": "0", "owner_bytes": "720000", "peak_requested": "720000", - "peak_usable": "720896", + "peak_usable": "720008", "reallocations": "0", "spilled_count": "0" }, @@ -245,11 +245,11 @@ "input": "small", "len": "10000", "live_requested": "560000", - "live_usable": "565760", + "live_usable": "640024", "moved_reallocations": "0", "owner_bytes": "240000", "peak_requested": "560000", - "peak_usable": "565760", + "peak_usable": "640024", "reallocations": "0", "spilled_count": "na" }, @@ -268,11 +268,11 @@ "input": "small", "len": "10000", "live_requested": "480000", - "live_usable": "561920", + "live_usable": "480024", "moved_reallocations": "0", "owner_bytes": "80000", "peak_requested": "480000", - "peak_usable": "561920", + "peak_usable": "480024", "reallocations": "0", "spilled_count": "na" }, @@ -291,11 +291,11 @@ "input": "small", "len": "10000", "live_requested": "560000", - "live_usable": "561920", + "live_usable": "640024", "moved_reallocations": "0", "owner_bytes": "80000", "peak_requested": "560000", - "peak_usable": "561920", + "peak_usable": "640024", "reallocations": "0", "spilled_count": "na" }, @@ -314,11 +314,11 @@ "input": "small", "len": "10000", "live_requested": "400000", - "live_usable": "401408", + "live_usable": "400008", "moved_reallocations": "0", "owner_bytes": "400000", "peak_requested": "400000", - "peak_usable": "401408", + "peak_usable": "400008", "reallocations": "0", "spilled_count": "0" }, @@ -337,11 +337,11 @@ "input": "small", "len": "10000", "live_requested": "720000", - "live_usable": "720896", + "live_usable": "720008", "moved_reallocations": "0", "owner_bytes": "720000", "peak_requested": "720000", - "peak_usable": "720896", + "peak_usable": "720008", "reallocations": "0", "spilled_count": "0" }, @@ -360,11 +360,11 @@ "input": "1", "len": "1", "live_requested": "32", - "live_usable": "32", + "live_usable": "40", "moved_reallocations": "0", "owner_bytes": "24", "peak_requested": "32", - "peak_usable": "32", + "peak_usable": "40", "reallocations": "0", "spilled_count": "na" }, @@ -383,11 +383,11 @@ "input": "1", "len": "1", "live_requested": "40", - "live_usable": "48", + "live_usable": "40", "moved_reallocations": "0", "owner_bytes": "8", "peak_requested": "40", - "peak_usable": "48", + "peak_usable": "40", "reallocations": "0", "spilled_count": "na" }, @@ -406,11 +406,11 @@ "input": "1", "len": "1", "live_requested": "48", - "live_usable": "48", + "live_usable": "56", "moved_reallocations": "0", "owner_bytes": "8", "peak_requested": "48", - "peak_usable": "48", + "peak_usable": "56", "reallocations": "0", "spilled_count": "na" }, @@ -475,11 +475,11 @@ "input": "1", "len": "1", "live_requested": "8", - "live_usable": "8", + "live_usable": "24", "moved_reallocations": "0", "owner_bytes": "24", "peak_requested": "8", - "peak_usable": "8", + "peak_usable": "24", "reallocations": "0", "spilled_count": "na" }, @@ -498,11 +498,11 @@ "input": "1", "len": "1", "live_requested": "16", - "live_usable": "16", + "live_usable": "24", "moved_reallocations": "0", "owner_bytes": "8", "peak_requested": "16", - "peak_usable": "16", + "peak_usable": "24", "reallocations": "0", "spilled_count": "na" }, @@ -521,11 +521,11 @@ "input": "1", "len": "1", "live_requested": "24", - "live_usable": "32", + "live_usable": "24", "moved_reallocations": "0", "owner_bytes": "8", "peak_requested": "24", - "peak_usable": "32", + "peak_usable": "24", "reallocations": "0", "spilled_count": "na" }, @@ -590,11 +590,11 @@ "input": "1", "len": "1", "live_requested": "1", - "live_usable": "8", + "live_usable": "24", "moved_reallocations": "0", "owner_bytes": "24", "peak_requested": "1", - "peak_usable": "8", + "peak_usable": "24", "reallocations": "0", "spilled_count": "na" }, @@ -613,11 +613,11 @@ "input": "1", "len": "1", "live_requested": "9", - "live_usable": "16", + "live_usable": "24", "moved_reallocations": "0", "owner_bytes": "8", "peak_requested": "9", - "peak_usable": "16", + "peak_usable": "24", "reallocations": "0", "spilled_count": "na" }, @@ -636,11 +636,11 @@ "input": "1", "len": "1", "live_requested": "17", - "live_usable": "32", + "live_usable": "24", "moved_reallocations": "0", "owner_bytes": "8", "peak_requested": "17", - "peak_usable": "32", + "peak_usable": "24", "reallocations": "0", "spilled_count": "na" }, @@ -705,11 +705,11 @@ "input": "4", "len": "4", "live_requested": "32", - "live_usable": "32", + "live_usable": "40", "moved_reallocations": "0", "owner_bytes": "24", "peak_requested": "32", - "peak_usable": "32", + "peak_usable": "40", "reallocations": "0", "spilled_count": "na" }, @@ -728,11 +728,11 @@ "input": "4", "len": "4", "live_requested": "40", - "live_usable": "48", + "live_usable": "40", "moved_reallocations": "0", "owner_bytes": "8", "peak_requested": "40", - "peak_usable": "48", + "peak_usable": "40", "reallocations": "0", "spilled_count": "na" }, @@ -751,11 +751,11 @@ "input": "4", "len": "4", "live_requested": "48", - "live_usable": "48", + "live_usable": "56", "moved_reallocations": "0", "owner_bytes": "8", "peak_requested": "48", - "peak_usable": "48", + "peak_usable": "56", "reallocations": "0", "spilled_count": "na" }, @@ -820,11 +820,11 @@ "input": "4", "len": "4", "live_requested": "32", - "live_usable": "32", + "live_usable": "40", "moved_reallocations": "0", "owner_bytes": "24", "peak_requested": "32", - "peak_usable": "32", + "peak_usable": "40", "reallocations": "0", "spilled_count": "na" }, @@ -843,11 +843,11 @@ "input": "4", "len": "4", "live_requested": "40", - "live_usable": "48", + "live_usable": "40", "moved_reallocations": "0", "owner_bytes": "8", "peak_requested": "40", - "peak_usable": "48", + "peak_usable": "40", "reallocations": "0", "spilled_count": "na" }, @@ -866,11 +866,11 @@ "input": "4", "len": "4", "live_requested": "48", - "live_usable": "48", + "live_usable": "56", "moved_reallocations": "0", "owner_bytes": "8", "peak_requested": "48", - "peak_usable": "48", + "peak_usable": "56", "reallocations": "0", "spilled_count": "na" }, @@ -935,11 +935,11 @@ "input": "4", "len": "4", "live_requested": "4", - "live_usable": "8", + "live_usable": "24", "moved_reallocations": "0", "owner_bytes": "24", "peak_requested": "4", - "peak_usable": "8", + "peak_usable": "24", "reallocations": "0", "spilled_count": "na" }, @@ -958,11 +958,11 @@ "input": "4", "len": "4", "live_requested": "12", - "live_usable": "16", + "live_usable": "24", "moved_reallocations": "0", "owner_bytes": "8", "peak_requested": "12", - "peak_usable": "16", + "peak_usable": "24", "reallocations": "0", "spilled_count": "na" }, @@ -981,11 +981,11 @@ "input": "4", "len": "4", "live_requested": "20", - "live_usable": "32", + "live_usable": "24", "moved_reallocations": "0", "owner_bytes": "8", "peak_requested": "20", - "peak_usable": "32", + "peak_usable": "24", "reallocations": "0", "spilled_count": "na" }, @@ -1045,16 +1045,16 @@ "deallocations": "1", "element_size": "8", "implementation": "Vec", - "in_place_reallocations": "0", + "in_place_reallocations": "7", "inline_capacity": "0", "input": "1024", "len": "1024", "live_requested": "8192", - "live_usable": "8192", - "moved_reallocations": "8", + "live_usable": "8200", + "moved_reallocations": "1", "owner_bytes": "24", "peak_requested": "8192", - "peak_usable": "8192", + "peak_usable": "8200", "reallocations": "8", "spilled_count": "na" }, @@ -1068,16 +1068,16 @@ "deallocations": "1", "element_size": "8", "implementation": "JackVec", - "in_place_reallocations": "0", + "in_place_reallocations": "7", "inline_capacity": "0", "input": "1024", "len": "1024", "live_requested": "8200", - "live_usable": "9216", - "moved_reallocations": "8", + "live_usable": "8200", + "moved_reallocations": "1", "owner_bytes": "8", "peak_requested": "8200", - "peak_usable": "9216", + "peak_usable": "8200", "reallocations": "8", "spilled_count": "na" }, @@ -1091,16 +1091,16 @@ "deallocations": "1", "element_size": "8", "implementation": "ThinVec", - "in_place_reallocations": "0", + "in_place_reallocations": "6", "inline_capacity": "0", "input": "1024", "len": "1024", "live_requested": "8208", - "live_usable": "9216", - "moved_reallocations": "8", + "live_usable": "8216", + "moved_reallocations": "2", "owner_bytes": "8", "peak_requested": "8208", - "peak_usable": "9216", + "peak_usable": "8216", "reallocations": "8", "spilled_count": "na" }, @@ -1114,16 +1114,16 @@ "deallocations": "1", "element_size": "8", "implementation": "SmallVec4", - "in_place_reallocations": "0", + "in_place_reallocations": "6", "inline_capacity": "4", "input": "1024", "len": "1024", "live_requested": "8192", - "live_usable": "8192", - "moved_reallocations": "7", + "live_usable": "8200", + "moved_reallocations": "1", "owner_bytes": "40", "peak_requested": "8192", - "peak_usable": "8192", + "peak_usable": "8200", "reallocations": "7", "spilled_count": "1" }, @@ -1137,16 +1137,16 @@ "deallocations": "1", "element_size": "8", "implementation": "SmallVec8", - "in_place_reallocations": "0", + "in_place_reallocations": "6", "inline_capacity": "8", "input": "1024", "len": "1024", "live_requested": "8192", - "live_usable": "8192", - "moved_reallocations": "6", + "live_usable": "8200", + "moved_reallocations": "0", "owner_bytes": "72", "peak_requested": "8192", - "peak_usable": "8192", + "peak_usable": "8200", "reallocations": "6", "spilled_count": "1" }, @@ -1165,11 +1165,11 @@ "input": "1024", "len": "1024", "live_requested": "8192", - "live_usable": "8192", + "live_usable": "8200", "moved_reallocations": "0", "owner_bytes": "24", "peak_requested": "8192", - "peak_usable": "8192", + "peak_usable": "8200", "reallocations": "0", "spilled_count": "na" }, @@ -1188,11 +1188,11 @@ "input": "1024", "len": "1024", "live_requested": "8200", - "live_usable": "9216", + "live_usable": "8200", "moved_reallocations": "0", "owner_bytes": "8", "peak_requested": "8200", - "peak_usable": "9216", + "peak_usable": "8200", "reallocations": "0", "spilled_count": "na" }, @@ -1211,11 +1211,11 @@ "input": "1024", "len": "1024", "live_requested": "8208", - "live_usable": "9216", + "live_usable": "8216", "moved_reallocations": "0", "owner_bytes": "8", "peak_requested": "8208", - "peak_usable": "9216", + "peak_usable": "8216", "reallocations": "0", "spilled_count": "na" }, @@ -1234,11 +1234,11 @@ "input": "1024", "len": "1024", "live_requested": "8192", - "live_usable": "8192", + "live_usable": "8200", "moved_reallocations": "0", "owner_bytes": "40", "peak_requested": "8192", - "peak_usable": "8192", + "peak_usable": "8200", "reallocations": "0", "spilled_count": "1" }, @@ -1257,11 +1257,11 @@ "input": "1024", "len": "1024", "live_requested": "8192", - "live_usable": "8192", + "live_usable": "8200", "moved_reallocations": "0", "owner_bytes": "72", "peak_requested": "8192", - "peak_usable": "8192", + "peak_usable": "8200", "reallocations": "0", "spilled_count": "1" }, @@ -1280,11 +1280,11 @@ "input": "1024", "len": "1024", "live_requested": "1024", - "live_usable": "1024", + "live_usable": "1032", "moved_reallocations": "0", "owner_bytes": "24", "peak_requested": "1024", - "peak_usable": "1024", + "peak_usable": "1032", "reallocations": "0", "spilled_count": "na" }, @@ -1303,11 +1303,11 @@ "input": "1024", "len": "1024", "live_requested": "1032", - "live_usable": "1152", + "live_usable": "1032", "moved_reallocations": "0", "owner_bytes": "8", "peak_requested": "1032", - "peak_usable": "1152", + "peak_usable": "1032", "reallocations": "0", "spilled_count": "na" }, @@ -1326,11 +1326,11 @@ "input": "1024", "len": "1024", "live_requested": "1040", - "live_usable": "1152", + "live_usable": "1048", "moved_reallocations": "0", "owner_bytes": "8", "peak_requested": "1040", - "peak_usable": "1152", + "peak_usable": "1048", "reallocations": "0", "spilled_count": "na" }, @@ -1349,11 +1349,11 @@ "input": "1024", "len": "1024", "live_requested": "1024", - "live_usable": "1024", + "live_usable": "1032", "moved_reallocations": "0", "owner_bytes": "24", "peak_requested": "1024", - "peak_usable": "1024", + "peak_usable": "1032", "reallocations": "0", "spilled_count": "1" }, @@ -1372,11 +1372,11 @@ "input": "1024", "len": "1024", "live_requested": "1024", - "live_usable": "1024", + "live_usable": "1032", "moved_reallocations": "0", "owner_bytes": "24", "peak_requested": "1024", - "peak_usable": "1024", + "peak_usable": "1032", "reallocations": "0", "spilled_count": "1" } @@ -1386,7 +1386,7 @@ "benchmark": "append_preallocated/1024", "classification": "baseline", "implementation": "Vec", - "median_ns": 161.77505719799845, + "median_ns": 160.17291554599245, "ratio_ci95": [ 1.0, 1.0 @@ -1395,53 +1395,53 @@ }, { "benchmark": "append_preallocated/1024", - "classification": "equivalent", + "classification": "inconclusive", "implementation": "JackVec", - "median_ns": 163.95494281430712, + "median_ns": 163.41215927995563, "ratio_ci95": [ - 0.9968067917976962, - 1.021851996291705 + 1.0174369059337276, + 1.032576992134615 ], - "ratio_to_vec": 1.0146403891728422 + "ratio_to_vec": 1.0184187823291182 }, { "benchmark": "append_preallocated/1024", "classification": "loss", "implementation": "ThinVec", - "median_ns": 508.7755249016675, + "median_ns": 521.5983660688614, "ratio_ci95": [ - 3.126091837642611, - 3.1933961619509517 + 3.205042459741613, + 3.2733062679932505 ], - "ratio_to_vec": 3.1447614354622004 + "ratio_to_vec": 3.270540728322082 }, { "benchmark": "append_preallocated/1024", "classification": "loss", "implementation": "SmallVec4", - "median_ns": 192.69557853717026, + "median_ns": 210.06355780443113, "ratio_ci95": [ - 1.1770104344961798, - 1.2282828255995037 + 1.285069602602837, + 1.3197121808236052 ], - "ratio_to_vec": 1.194446822944933 + "ratio_to_vec": 1.3161057696941427 }, { "benchmark": "append_preallocated/1024", "classification": "loss", "implementation": "SmallVec8", - "median_ns": 208.08677917447972, + "median_ns": 196.38371067333136, "ratio_ci95": [ - 1.2784436451729397, - 1.2992798502694207 + 1.2166573980987048, + 1.2404888958272693 ], - "ratio_to_vec": 1.2872581782861556 + "ratio_to_vec": 1.2313706597220364 }, { "benchmark": "append_preallocated/4", "classification": "baseline", "implementation": "Vec", - "median_ns": 2.589009125638002, + "median_ns": 2.794042511351854, "ratio_ci95": [ 1.0, 1.0 @@ -1452,51 +1452,51 @@ "benchmark": "append_preallocated/4", "classification": "loss", "implementation": "JackVec", - "median_ns": 3.7191597038244684, + "median_ns": 3.7279018878624495, "ratio_ci95": [ - 1.4326508604689718, - 1.482222680158473 + 1.2998381645838382, + 1.348250833819429 ], - "ratio_to_vec": 1.436101678793757 + "ratio_to_vec": 1.3295881265237688 }, { "benchmark": "append_preallocated/4", "classification": "loss", "implementation": "ThinVec", - "median_ns": 4.116052245175519, + "median_ns": 4.317646302632596, "ratio_ci95": [ - 1.5669916975036808, - 1.6184725493637409 + 1.5384064135976976, + 1.556552391394826 ], - "ratio_to_vec": 1.585537126766058 + "ratio_to_vec": 1.5508539310268377 }, { "benchmark": "append_preallocated/4", "classification": "loss", "implementation": "SmallVec4", - "median_ns": 5.723299667656713, + "median_ns": 5.721821243042672, "ratio_ci95": [ - 2.204585844891109, - 2.214086132111562 + 2.0311587336677026, + 2.0610830166515597 ], - "ratio_to_vec": 2.2114811493112905 + "ratio_to_vec": 2.047424616578168 }, { "benchmark": "append_preallocated/4", "classification": "loss", "implementation": "SmallVec8", - "median_ns": 5.71031215270582, + "median_ns": 5.704092315013086, "ratio_ci95": [ - 2.192728130873105, - 2.2090015458612355 + 2.019313623974253, + 2.147839573022315 ], - "ratio_to_vec": 2.2004727111785836 + "ratio_to_vec": 2.048839037023854 }, { "benchmark": "build_growing_and_drop/1", "classification": "baseline", "implementation": "Vec", - "median_ns": 8.311868970446922, + "median_ns": 11.49125557811567, "ratio_ci95": [ 1.0, 1.0 @@ -1507,51 +1507,51 @@ "benchmark": "build_growing_and_drop/1", "classification": "win", "implementation": "JackVec", - "median_ns": 7.682645379876533, + "median_ns": 10.90502352419615, "ratio_ci95": [ - 0.9221977888382257, - 0.9380949120486872 + 0.916597021986322, + 0.9586379226515621 ], - "ratio_to_vec": 0.9269530663614397 + "ratio_to_vec": 0.947078976091108 }, { "benchmark": "build_growing_and_drop/1", "classification": "win", "implementation": "ThinVec", - "median_ns": 7.658920989740534, + "median_ns": 10.516007626652433, "ratio_ci95": [ - 0.9207554830180028, - 0.9266491222139418 + 0.8817160245995838, + 0.940018196108239 ], - "ratio_to_vec": 0.9224474426795347 + "ratio_to_vec": 0.9065650545806921 }, { "benchmark": "build_growing_and_drop/1", "classification": "win", "implementation": "SmallVec4", - "median_ns": 2.0536155396050595, + "median_ns": 2.054063187652905, "ratio_ci95": [ - 0.2409117289722443, - 0.24870737657868874 + 0.17721465149384796, + 0.17959277562134834 ], - "ratio_to_vec": 0.24710260180745558 + "ratio_to_vec": 0.17903169414751302 }, { "benchmark": "build_growing_and_drop/1", "classification": "win", "implementation": "SmallVec8", - "median_ns": 3.2049950101053506, + "median_ns": 3.2126024967165643, "ratio_ci95": [ - 0.37632426004844854, - 0.3879007871376156 + 0.27463237587239103, + 0.2827137473137171 ], - "ratio_to_vec": 0.37921128734980103 + "ratio_to_vec": 0.27819636864116604 }, { "benchmark": "build_growing_and_drop/1024", "classification": "baseline", "implementation": "Vec", - "median_ns": 678.7348819835263, + "median_ns": 699.8556263101061, "ratio_ci95": [ 1.0, 1.0 @@ -1560,53 +1560,53 @@ }, { "benchmark": "build_growing_and_drop/1024", - "classification": "win", + "classification": "inconclusive", "implementation": "JackVec", - "median_ns": 562.0511615597011, + "median_ns": 611.9267177502354, "ratio_ci95": [ - 0.817005717550381, - 0.8452634259565537 + 0.7846572747242015, + 1.0690000187158102 ], - "ratio_to_vec": 0.8266457746695103 + "ratio_to_vec": 0.8743613607516968 }, { "benchmark": "build_growing_and_drop/1024", "classification": "win", "implementation": "ThinVec", - "median_ns": 550.8953346066849, + "median_ns": 557.1906354630892, "ratio_ci95": [ - 0.8019214781913301, - 0.8304769355506499 + 0.7629267218885628, + 0.9683829873165666 ], - "ratio_to_vec": 0.8109718569913577 + "ratio_to_vec": 0.8044861920403531 }, { "benchmark": "build_growing_and_drop/1024", "classification": "loss", "implementation": "SmallVec4", - "median_ns": 1002.8559436664546, + "median_ns": 933.8900403355245, "ratio_ci95": [ - 1.4662726621110902, - 1.5099333239819326 + 1.3253172103064097, + 1.6187553115955446 ], - "ratio_to_vec": 1.4783675584747955 + "ratio_to_vec": 1.4759713886835248 }, { "benchmark": "build_growing_and_drop/1024", "classification": "loss", "implementation": "SmallVec8", - "median_ns": 1006.0232899321475, + "median_ns": 929.4838285314125, "ratio_ci95": [ - 1.4274376907364172, - 1.5069487035696778 + 1.2779233213612182, + 1.4946731155732673 ], - "ratio_to_vec": 1.4746273448169824 + "ratio_to_vec": 1.4317821180831225 }, { "benchmark": "build_growing_and_drop/4", "classification": "baseline", "implementation": "Vec", - "median_ns": 9.265608441871443, + "median_ns": 12.383364879414792, "ratio_ci95": [ 1.0, 1.0 @@ -1615,53 +1615,53 @@ }, { "benchmark": "build_growing_and_drop/4", - "classification": "inconclusive", + "classification": "win", "implementation": "JackVec", - "median_ns": 8.94698208316751, + "median_ns": 11.622488064558572, "ratio_ci95": [ - 0.9573069961137739, - 0.9797498683903755 + 0.9220824764418566, + 0.9401101543000395 ], - "ratio_to_vec": 0.968763598667124 + "ratio_to_vec": 0.9379327468546215 }, { "benchmark": "build_growing_and_drop/4", "classification": "win", "implementation": "ThinVec", - "median_ns": 8.468225239740708, + "median_ns": 11.3678848989573, "ratio_ci95": [ - 0.8921372739981763, - 0.9345045459483057 + 0.9085117293280376, + 0.9543182581035011 ], - "ratio_to_vec": 0.9231650546653072 + "ratio_to_vec": 0.9100808245478623 }, { "benchmark": "build_growing_and_drop/4", - "classification": "loss", + "classification": "win", "implementation": "SmallVec4", - "median_ns": 10.868385004852975, + "median_ns": 10.901327631166954, "ratio_ci95": [ - 1.168956131243969, - 1.188770074108358 + 0.8576748146582402, + 0.8816242046122791 ], - "ratio_to_vec": 1.1729812535287545 + "ratio_to_vec": 0.8803648876910334 }, { "benchmark": "build_growing_and_drop/4", - "classification": "inconclusive", + "classification": "win", "implementation": "SmallVec8", - "median_ns": 8.724095096770357, + "median_ns": 9.186105614393206, "ratio_ci95": [ - 0.9282419824881796, - 1.008598230767938 + 0.6931705118199425, + 0.7944701173572201 ], - "ratio_to_vec": 0.9413956728406905 + "ratio_to_vec": 0.7418101383464459 }, { "benchmark": "dedup_adjacent_pairs/64_byte", "classification": "baseline", "implementation": "Vec", - "median_ns": 967.3551650448137, + "median_ns": 972.7387630348795, "ratio_ci95": [ 1.0, 1.0 @@ -1672,51 +1672,51 @@ "benchmark": "dedup_adjacent_pairs/64_byte", "classification": "loss", "implementation": "JackVec", - "median_ns": 1039.2353176778752, + "median_ns": 1070.4035296328984, "ratio_ci95": [ - 1.0708986290957339, - 1.0756920584855694 + 1.0982132844241868, + 1.1004018450887179 ], - "ratio_to_vec": 1.072976578433573 + "ratio_to_vec": 1.099864493948965 }, { "benchmark": "dedup_adjacent_pairs/64_byte", "classification": "loss", "implementation": "ThinVec", - "median_ns": 1006.2766152117114, + "median_ns": 1097.9020385898862, "ratio_ci95": [ - 1.0391085467326746, - 1.041911577095716 + 1.0808809171631322, + 1.1339314953427706 ], - "ratio_to_vec": 1.0401429315688266 + "ratio_to_vec": 1.1302429025796041 }, { "benchmark": "dedup_adjacent_pairs/64_byte", "classification": "loss", "implementation": "SmallVec4", - "median_ns": 1144.6561457496118, + "median_ns": 1099.3128271788341, "ratio_ci95": [ - 1.1787299643438678, - 1.197650866320387 + 1.1267490536451221, + 1.1394744142295854 ], - "ratio_to_vec": 1.183284265295244 + "ratio_to_vec": 1.1311154311586264 }, { "benchmark": "dedup_adjacent_pairs/64_byte", "classification": "loss", "implementation": "SmallVec8", - "median_ns": 1147.1235264558886, + "median_ns": 1098.7605541804182, "ratio_ci95": [ - 1.1815767720060844, - 1.196587620156839 + 1.127882615615235, + 1.1349512719068484 ], - "ratio_to_vec": 1.1856014957348264 + "ratio_to_vec": 1.1311267074354536 }, { "benchmark": "dedup_adjacent_pairs/u64", "classification": "baseline", "implementation": "Vec", - "median_ns": 267.9117823332955, + "median_ns": 307.613152823659, "ratio_ci95": [ 1.0, 1.0 @@ -1725,53 +1725,53 @@ }, { "benchmark": "dedup_adjacent_pairs/u64", - "classification": "inconclusive", + "classification": "loss", "implementation": "JackVec", - "median_ns": 282.5486322924231, + "median_ns": 328.8723810750472, "ratio_ci95": [ - 1.0017902047950298, - 1.0665727516224783 + 1.0417480092454188, + 1.0960986499071799 ], - "ratio_to_vec": 1.0589503672450276 + "ratio_to_vec": 1.069110270663801 }, { "benchmark": "dedup_adjacent_pairs/u64", "classification": "loss", "implementation": "ThinVec", - "median_ns": 369.63072247497956, + "median_ns": 524.800204432664, "ratio_ci95": [ - 1.3755367445636895, - 1.5477378785285156 + 1.3866207195069966, + 1.7173380268447764 ], - "ratio_to_vec": 1.3836190278425138 + "ratio_to_vec": 1.6930945555292625 }, { "benchmark": "dedup_adjacent_pairs/u64", "classification": "loss", "implementation": "SmallVec4", - "median_ns": 447.8860844947735, + "median_ns": 396.14635508524395, "ratio_ci95": [ - 1.5893518476061512, - 2.043953400298191 + 1.249929090596081, + 1.3234253029643606 ], - "ratio_to_vec": 1.6592116901972738 + "ratio_to_vec": 1.2810032610567437 }, { "benchmark": "dedup_adjacent_pairs/u64", "classification": "loss", "implementation": "SmallVec8", - "median_ns": 367.33583411009477, + "median_ns": 397.9712301587301, "ratio_ci95": [ - 1.306555753795462, - 1.383774362921717 + 1.2628780445411638, + 1.3315888029349958 ], - "ratio_to_vec": 1.3743112956828791 + "ratio_to_vec": 1.2900308494005235 }, { "benchmark": "extend_reserved_1024", "classification": "baseline", "implementation": "Vec", - "median_ns": 152.20840524509512, + "median_ns": 154.1303116024776, "ratio_ci95": [ 1.0, 1.0 @@ -1780,53 +1780,53 @@ }, { "benchmark": "extend_reserved_1024", - "classification": "loss", + "classification": "inconclusive", "implementation": "JackVec", - "median_ns": 164.9307118263884, + "median_ns": 159.46427432216905, "ratio_ci95": [ - 1.0383200636146916, - 1.112638448000239 + 1.011645074745935, + 1.05307952157345 ], - "ratio_to_vec": 1.0724442118020505 + "ratio_to_vec": 1.0346068379686952 }, { "benchmark": "extend_reserved_1024", "classification": "inconclusive", "implementation": "ThinVec", - "median_ns": 155.38174191716968, + "median_ns": 149.00692138414504, "ratio_ci95": [ - 0.9771884688976008, - 1.059219256508823 + 0.9383618600618147, + 0.9716515728588463 ], - "ratio_to_vec": 1.020848629659871 + "ratio_to_vec": 0.9635754179796598 }, { "benchmark": "extend_reserved_1024", - "classification": "inconclusive", + "classification": "loss", "implementation": "SmallVec4", - "median_ns": 148.66015759967007, + "median_ns": 184.0752169720347, "ratio_ci95": [ - 0.9288515095237042, - 1.0210922589663562 + 1.1599380556589027, + 1.2003977372061965 ], - "ratio_to_vec": 1.0005831987212552 + "ratio_to_vec": 1.194330640380297 }, { "benchmark": "extend_reserved_1024", - "classification": "inconclusive", + "classification": "loss", "implementation": "SmallVec8", - "median_ns": 160.7589997937258, + "median_ns": 182.01735815745127, "ratio_ci95": [ - 0.9878037048030517, - 1.0775951895652272 + 1.1462430414479867, + 1.189108983629469 ], - "ratio_to_vec": 1.0437531269978644 + "ratio_to_vec": 1.1827666201289584 }, { "benchmark": "nested_construct_and_drop/empty", "classification": "baseline", "implementation": "Vec", - "median_ns": 18932.941566265057, + "median_ns": 18959.340734366036, "ratio_ci95": [ 1.0, 1.0 @@ -1837,51 +1837,51 @@ "benchmark": "nested_construct_and_drop/empty", "classification": "win", "implementation": "JackVec", - "median_ns": 12071.658619505495, + "median_ns": 9642.448895705522, "ratio_ci95": [ - 0.5752664646597035, - 0.6393564531490558 + 0.5002434680355722, + 0.5680181986104464 ], - "ratio_to_vec": 0.6348300012584576 + "ratio_to_vec": 0.5112108517835104 }, { "benchmark": "nested_construct_and_drop/empty", "classification": "win", "implementation": "ThinVec", - "median_ns": 10761.008969025728, + "median_ns": 10747.226462057692, "ratio_ci95": [ - 0.502946423562235, - 0.5704376222370897 + 0.5651298055029649, + 0.5762366525831322 ], - "ratio_to_vec": 0.5654569799544956 + "ratio_to_vec": 0.5696885784349376 }, { "benchmark": "nested_construct_and_drop/empty", "classification": "loss", "implementation": "SmallVec4", - "median_ns": 21602.297108066974, + "median_ns": 22251.788560632085, "ratio_ci95": [ - 1.1272137898541237, - 1.1536782794097855 + 1.1700831824618905, + 1.2044287713830912 ], - "ratio_to_vec": 1.143328790394568 + "ratio_to_vec": 1.1757139165756259 }, { "benchmark": "nested_construct_and_drop/empty", "classification": "loss", "implementation": "SmallVec8", - "median_ns": 27141.30669111146, + "median_ns": 27187.11686678982, "ratio_ci95": [ - 1.431947341112366, - 1.4429782446672175 + 1.4261346642731434, + 1.45835360925609 ], - "ratio_to_vec": 1.4374967124915767 + "ratio_to_vec": 1.447408852923845 }, { "benchmark": "nested_construct_and_drop/small", "classification": "baseline", "implementation": "Vec", - "median_ns": 113911.53565426171, + "median_ns": 226517.1144082633, "ratio_ci95": [ 1.0, 1.0 @@ -1892,51 +1892,51 @@ "benchmark": "nested_construct_and_drop/small", "classification": "win", "implementation": "JackVec", - "median_ns": 108169.50775613275, + "median_ns": 213288.40917397663, "ratio_ci95": [ - 0.9349619187296131, - 0.9552830500944242 + 0.8965874505613862, + 0.9458198241665767 ], - "ratio_to_vec": 0.948390575856458 + "ratio_to_vec": 0.9437711760101072 }, { "benchmark": "nested_construct_and_drop/small", "classification": "win", "implementation": "ThinVec", - "median_ns": 103041.8282395528, + "median_ns": 214035.34479166666, "ratio_ci95": [ - 0.8913125867559306, - 0.9169534191703026 + 0.8944960450029138, + 0.9483826650660273 ], - "ratio_to_vec": 0.9045776413049151 + "ratio_to_vec": 0.9464805772594259 }, { "benchmark": "nested_construct_and_drop/small", - "classification": "loss", + "classification": "win", "implementation": "SmallVec4", - "median_ns": 126057.1113360324, + "median_ns": 128721.88981093952, "ratio_ci95": [ - 1.1007648790469693, - 1.111522249279069 + 0.5568034898998891, + 0.5708758433458613 ], - "ratio_to_vec": 1.1071870606271335 + "ratio_to_vec": 0.5680684301045823 }, { "benchmark": "nested_construct_and_drop/small", - "classification": "loss", + "classification": "win", "implementation": "SmallVec8", - "median_ns": 133435.79833333334, + "median_ns": 131863.72829861112, "ratio_ci95": [ - 1.1602283100913846, - 1.1801373278098373 + 0.5682802617656333, + 0.5857736925071304 ], - "ratio_to_vec": 1.1699161459301493 + "ratio_to_vec": 0.5834784290971285 }, { "benchmark": "nested_construct_and_drop/sparse", "classification": "baseline", "implementation": "Vec", - "median_ns": 37194.695593635246, + "median_ns": 63121.47997425997, "ratio_ci95": [ 1.0, 1.0 @@ -1947,51 +1947,51 @@ "benchmark": "nested_construct_and_drop/sparse", "classification": "win", "implementation": "JackVec", - "median_ns": 32354.042686018507, + "median_ns": 56704.90982142858, "ratio_ci95": [ - 0.8613418922675378, - 0.877225704431685 + 0.8870333393691006, + 0.9140157072171505 ], - "ratio_to_vec": 0.8735633250274036 + "ratio_to_vec": 0.8923439710511276 }, { "benchmark": "nested_construct_and_drop/sparse", "classification": "win", "implementation": "ThinVec", - "median_ns": 30068.76109540906, + "median_ns": 54584.925287356324, "ratio_ci95": [ - 0.781872980811353, - 0.8132841108086539 + 0.8481359964006424, + 0.8781635118881044 ], - "ratio_to_vec": 0.8107140996742704 + "ratio_to_vec": 0.8620004998794688 }, { "benchmark": "nested_construct_and_drop/sparse", - "classification": "loss", + "classification": "win", "implementation": "SmallVec4", - "median_ns": 40198.085527319905, + "median_ns": 40560.40676847662, "ratio_ci95": [ - 1.078137071794029, - 1.083820999924278 + 0.6289545121501527, + 0.6536741325215479 ], - "ratio_to_vec": 1.0798472719510126 + "ratio_to_vec": 0.6424706152617586 }, { "benchmark": "nested_construct_and_drop/sparse", - "classification": "loss", + "classification": "win", "implementation": "SmallVec8", - "median_ns": 45716.869277597405, + "median_ns": 45610.577414965985, "ratio_ci95": [ - 1.2017461701447982, - 1.2414908084365726 + 0.7096560720171043, + 0.7262278219605758 ], - "ratio_to_vec": 1.2270313214646624 + "ratio_to_vec": 0.7167336239267664 }, { "benchmark": "nested_metadata_scan_sparse", "classification": "baseline", "implementation": "Vec", - "median_ns": 3971.0052934407363, + "median_ns": 3973.0030741410487, "ratio_ci95": [ 1.0, 1.0 @@ -2000,53 +2000,53 @@ }, { "benchmark": "nested_metadata_scan_sparse", - "classification": "inconclusive", + "classification": "equivalent", "implementation": "JackVec", - "median_ns": 4025.5293749770076, + "median_ns": 4003.8275468791417, "ratio_ci95": [ - 1.0128384735330087, - 1.057056106619877 + 1.0068981015504161, + 1.0145010511332668 ], - "ratio_to_vec": 1.0154805648397613 + "ratio_to_vec": 1.0101095784006857 }, { "benchmark": "nested_metadata_scan_sparse", - "classification": "inconclusive", + "classification": "equivalent", "implementation": "ThinVec", - "median_ns": 4018.0973693825354, + "median_ns": 4003.6772793533, "ratio_ci95": [ - 1.0077931885442024, - 1.0396325312507 + 1.006319571474522, + 1.0130910700795284 ], - "ratio_to_vec": 1.0128886554333494 + "ratio_to_vec": 1.0074540302834483 }, { "benchmark": "nested_metadata_scan_sparse", "classification": "inconclusive", "implementation": "SmallVec4", - "median_ns": 4085.2766780766297, + "median_ns": 4156.714338507021, "ratio_ci95": [ - 1.0265457316595619, - 1.0633884275454755 + 1.0158743103151195, + 1.0580023782964492 ], - "ratio_to_vec": 1.0276207691191632 + "ratio_to_vec": 1.0513591522643446 }, { "benchmark": "nested_metadata_scan_sparse", "classification": "loss", "implementation": "SmallVec8", - "median_ns": 5346.577738372407, + "median_ns": 5112.390979722116, "ratio_ci95": [ - 1.2604558682632276, - 1.3917850934149392 + 1.2498107970604542, + 1.3398565473555795 ], - "ratio_to_vec": 1.3461190413262374 + "ratio_to_vec": 1.292370850692826 }, { "benchmark": "nested_traverse/empty", "classification": "baseline", "implementation": "Vec", - "median_ns": 2197.8980411609086, + "median_ns": 2191.750836087504, "ratio_ci95": [ 1.0, 1.0 @@ -2057,51 +2057,51 @@ "benchmark": "nested_traverse/empty", "classification": "equivalent", "implementation": "JackVec", - "median_ns": 2152.7440403383716, + "median_ns": 2153.2508157128686, "ratio_ci95": [ - 0.978853586632099, - 0.9843910979826089 + 0.9820149265110161, + 0.9852791825896788 ], - "ratio_to_vec": 0.9803607485089639 + "ratio_to_vec": 0.9823614124842314 }, { "benchmark": "nested_traverse/empty", - "classification": "loss", + "classification": "equivalent", "implementation": "ThinVec", - "median_ns": 3955.254484770887, + "median_ns": 2155.136283435521, "ratio_ci95": [ - 1.7992689975103797, - 1.811240796556842 + 0.9815059927948094, + 0.9853773446266664 ], - "ratio_to_vec": 1.803737670526076 + "ratio_to_vec": 0.983139400818134 }, { "benchmark": "nested_traverse/empty", "classification": "loss", "implementation": "SmallVec4", - "median_ns": 5873.414578891257, + "median_ns": 5875.006463219616, "ratio_ci95": [ - 1.8401487842146769, - 2.6844892329437586 + 2.678896684240865, + 2.692278350454198 ], - "ratio_to_vec": 2.678065094397275 + "ratio_to_vec": 2.680808423720563 }, { "benchmark": "nested_traverse/empty", "classification": "loss", "implementation": "SmallVec8", - "median_ns": 6001.314672276957, + "median_ns": 6052.416315499173, "ratio_ci95": [ - 2.187416494867176, - 2.758512370160779 + 2.730145136771341, + 2.767309408383384 ], - "ratio_to_vec": 2.7368143791369315 + "ratio_to_vec": 2.7614527234780692 }, { "benchmark": "nested_traverse/small", "classification": "baseline", "implementation": "Vec", - "median_ns": 21533.945176700818, + "median_ns": 21414.992845786965, "ratio_ci95": [ 1.0, 1.0 @@ -2112,51 +2112,51 @@ "benchmark": "nested_traverse/small", "classification": "equivalent", "implementation": "JackVec", - "median_ns": 21523.873888067013, + "median_ns": 21420.348415379667, "ratio_ci95": [ - 0.9845919748459028, - 1.003136050685809 + 0.9995497100577972, + 1.0086086952463478 ], - "ratio_to_vec": 0.9992770883232633 + "ratio_to_vec": 1.000124039715426 }, { "benchmark": "nested_traverse/small", "classification": "equivalent", "implementation": "ThinVec", - "median_ns": 21521.78652657832, + "median_ns": 21424.41072891073, "ratio_ci95": [ - 0.9846346909790689, - 0.9998533172609713 + 0.9960586988718746, + 1.003852881569345 ], - "ratio_to_vec": 0.9994500713358617 + "ratio_to_vec": 1.0004397798865303 }, { "benchmark": "nested_traverse/small", "classification": "equivalent", "implementation": "SmallVec4", - "median_ns": 21421.318841568842, + "median_ns": 21418.572888219227, "ratio_ci95": [ - 0.9853099756306763, - 0.9970577443061337 + 0.9996555656182038, + 1.0002315922951437 ], - "ratio_to_vec": 0.9941298193685164 + "ratio_to_vec": 0.9997327541926596 }, { "benchmark": "nested_traverse/small", "classification": "equivalent", "implementation": "SmallVec8", - "median_ns": 21429.866093366094, + "median_ns": 21419.927480121354, "ratio_ci95": [ - 0.9831328042959161, - 0.9975399533849033 + 0.9990621182687982, + 1.0005631212726014 ], - "ratio_to_vec": 0.9951667433681713 + "ratio_to_vec": 1.0001901231824737 }, { "benchmark": "nested_traverse/sparse", "classification": "baseline", "implementation": "Vec", - "median_ns": 3242.745272388791, + "median_ns": 3087.824130190797, "ratio_ci95": [ 1.0, 1.0 @@ -2165,53 +2165,53 @@ }, { "benchmark": "nested_traverse/sparse", - "classification": "inconclusive", + "classification": "equivalent", "implementation": "JackVec", - "median_ns": 3055.7283117436964, + "median_ns": 3082.562393284007, "ratio_ci95": [ - 0.8272691280252745, - 0.9943450415319834 + 0.9829493744980716, + 1.0120635485985672 ], - "ratio_to_vec": 0.944642006864134 + "ratio_to_vec": 0.9992059100739077 }, { "benchmark": "nested_traverse/sparse", - "classification": "loss", + "classification": "equivalent", "implementation": "ThinVec", - "median_ns": 5241.9894693486585, + "median_ns": 3092.109044359255, "ratio_ci95": [ - 1.3795306770247378, - 1.705804641948998 + 0.9927844276689622, + 1.0255867216898658 ], - "ratio_to_vec": 1.6225997952230866 + "ratio_to_vec": 0.9989879908983073 }, { "benchmark": "nested_traverse/sparse", "classification": "loss", "implementation": "SmallVec4", - "median_ns": 5045.057546209273, + "median_ns": 6880.873944687046, "ratio_ci95": [ - 1.3267374393757838, - 1.6434602313503568 + 2.213175461934932, + 2.233124536287866 ], - "ratio_to_vec": 1.554875535397513 + "ratio_to_vec": 2.2283892004762187 }, { "benchmark": "nested_traverse/sparse", "classification": "loss", "implementation": "SmallVec8", - "median_ns": 5493.643374615509, + "median_ns": 5362.402458983106, "ratio_ci95": [ - 1.4760755424752596, - 1.7541472038579182 + 1.7140483782732727, + 1.8052769651795886 ], - "ratio_to_vec": 1.6669819766303633 + "ratio_to_vec": 1.7324666051671358 }, { "benchmark": "push_preallocated/1024", "classification": "baseline", "implementation": "Vec", - "median_ns": 439.967710756619, + "median_ns": 448.35393430099316, "ratio_ci95": [ 1.0, 1.0 @@ -2220,53 +2220,53 @@ }, { "benchmark": "push_preallocated/1024", - "classification": "equivalent", + "classification": "win", "implementation": "JackVec", - "median_ns": 432.5131836187069, + "median_ns": 427.53675371800375, "ratio_ci95": [ - 0.9774324863138661, - 0.9980499074819398 + 0.9503406585026164, + 0.9542398042538811 ], - "ratio_to_vec": 0.9861879579791306 + "ratio_to_vec": 0.9523878778029582 }, { "benchmark": "push_preallocated/1024", - "classification": "inconclusive", + "classification": "win", "implementation": "ThinVec", - "median_ns": 428.7961426211896, + "median_ns": 421.0121865643713, "ratio_ci95": [ - 0.9643236432752172, - 0.9829026100730435 + 0.9245209209056419, + 0.9443095965784474 ], - "ratio_to_vec": 0.9740712573723846 + "ratio_to_vec": 0.9383075505626651 }, { "benchmark": "push_preallocated/1024", "classification": "loss", "implementation": "SmallVec4", - "median_ns": 714.3224119683845, + "median_ns": 718.6651987670068, "ratio_ci95": [ - 1.6170948573050588, - 1.6434356204181497 + 1.592927279743963, + 1.609169840981262 ], - "ratio_to_vec": 1.6231981788792587 + "ratio_to_vec": 1.6028970502677595 }, { "benchmark": "push_preallocated/1024", "classification": "loss", "implementation": "SmallVec8", - "median_ns": 717.5355860305373, + "median_ns": 724.1310006166209, "ratio_ci95": [ - 1.6260237900536307, - 1.639956757715747 + 1.6118821678645274, + 1.6382703532946132 ], - "ratio_to_vec": 1.6304104789232847 + "ratio_to_vec": 1.620476396756259 }, { "benchmark": "push_preallocated/4", "classification": "baseline", "implementation": "Vec", - "median_ns": 2.2741486535989788, + "median_ns": 2.4424022452467873, "ratio_ci95": [ 1.0, 1.0 @@ -2277,51 +2277,51 @@ "benchmark": "push_preallocated/4", "classification": "win", "implementation": "JackVec", - "median_ns": 2.1027114709346026, + "median_ns": 2.1511694215908825, "ratio_ci95": [ - 0.9108694955653258, - 0.930566930368321 + 0.8588330161902367, + 0.896705598366185 ], - "ratio_to_vec": 0.9199692667562522 + "ratio_to_vec": 0.8821094667544078 }, { "benchmark": "push_preallocated/4", "classification": "win", "implementation": "ThinVec", - "median_ns": 2.1171564048249296, + "median_ns": 2.2543744429545156, "ratio_ci95": [ - 0.9168823247966023, - 0.9445036553562008 + 0.9046095415284482, + 0.93646387491388 ], - "ratio_to_vec": 0.9316944056581401 + "ratio_to_vec": 0.929766942187247 }, { "benchmark": "push_preallocated/4", "classification": "loss", "implementation": "SmallVec4", - "median_ns": 14.057505738270542, + "median_ns": 14.155153442875573, "ratio_ci95": [ - 6.0973308545428715, - 6.22120125403117 + 5.657250502621601, + 5.939555624419647 ], - "ratio_to_vec": 6.134575483687708 + "ratio_to_vec": 5.8122743674786035 }, { "benchmark": "push_preallocated/4", "classification": "loss", "implementation": "SmallVec8", - "median_ns": 14.101692284542334, + "median_ns": 14.186863564652612, "ratio_ci95": [ - 6.105453332680967, - 6.252572651086494 + 5.699930368295227, + 5.973664284763698 ], - "ratio_to_vec": 6.206677949413495 + "ratio_to_vec": 5.820020713385067 }, { "benchmark": "resize_reserved_1024", "classification": "baseline", "implementation": "Vec", - "median_ns": 154.6553120897317, + "median_ns": 144.51217017482793, "ratio_ci95": [ 1.0, 1.0 @@ -2330,53 +2330,53 @@ }, { "benchmark": "resize_reserved_1024", - "classification": "inconclusive", + "classification": "loss", "implementation": "JackVec", - "median_ns": 165.5923017958826, + "median_ns": 154.2296353963929, "ratio_ci95": [ - 1.0135380862144905, - 1.1069930637330465 + 1.0553831095076893, + 1.077326099368539 ], - "ratio_to_vec": 1.0707184871852653 + "ratio_to_vec": 1.0668141754044416 }, { "benchmark": "resize_reserved_1024", "classification": "loss", "implementation": "ThinVec", - "median_ns": 437.1122551148427, + "median_ns": 429.1447141098803, "ratio_ci95": [ - 2.7928512193274284, - 2.917156040633894 + 2.936608659172558, + 3.006213511951008 ], - "ratio_to_vec": 2.8295539617457153 + "ratio_to_vec": 2.969764238810807 }, { "benchmark": "resize_reserved_1024", - "classification": "inconclusive", + "classification": "equivalent", "implementation": "SmallVec4", - "median_ns": 153.33454270597127, + "median_ns": 144.2137358677748, "ratio_ci95": [ - 0.9389629898390772, - 1.0534691590301866 + 0.9868449769895029, + 1.0170822733455749 ], - "ratio_to_vec": 0.9816921049259186 + "ratio_to_vec": 0.9958431594007856 }, { "benchmark": "resize_reserved_1024", "classification": "inconclusive", "implementation": "SmallVec8", - "median_ns": 154.31301225312995, + "median_ns": 144.06552599249966, "ratio_ci95": [ - 0.9408712076576596, - 1.0389725812654502 + 0.947586286878275, + 1.009273292664424 ], - "ratio_to_vec": 1.004258407704554 + "ratio_to_vec": 1.000211795592092 }, { "benchmark": "retain_mixed/64_byte", "classification": "baseline", "implementation": "Vec", - "median_ns": 252.4944043655198, + "median_ns": 287.6386459345643, "ratio_ci95": [ 1.0, 1.0 @@ -2387,51 +2387,51 @@ "benchmark": "retain_mixed/64_byte", "classification": "loss", "implementation": "JackVec", - "median_ns": 294.814507165838, + "median_ns": 316.6989759160148, "ratio_ci95": [ - 1.1584533310215124, - 1.1939064764963263 + 1.0997258422429634, + 1.1196110907432661 ], - "ratio_to_vec": 1.1634224655878966 + "ratio_to_vec": 1.1046703011416203 }, { "benchmark": "retain_mixed/64_byte", "classification": "loss", "implementation": "ThinVec", - "median_ns": 445.4600914149444, + "median_ns": 444.7467362579281, "ratio_ci95": [ - 1.7595830803820292, - 1.7845301228314359 + 1.529194529569517, + 1.61125611293202 ], - "ratio_to_vec": 1.7677596280754804 + "ratio_to_vec": 1.5458630873961383 }, { "benchmark": "retain_mixed/64_byte", "classification": "loss", "implementation": "SmallVec4", - "median_ns": 526.9958189902467, + "median_ns": 553.0084640873209, "ratio_ci95": [ - 2.0755040332733503, - 2.1269014674543287 + 1.8892363153033247, + 1.9665880826352913 ], - "ratio_to_vec": 2.088615438178562 + "ratio_to_vec": 1.9257264675115549 }, { "benchmark": "retain_mixed/64_byte", "classification": "loss", "implementation": "SmallVec8", - "median_ns": 531.9739625590503, + "median_ns": 547.5689540566959, "ratio_ci95": [ - 2.0977049557969805, - 2.1200152611682577 + 1.880084097834924, + 1.9204244828700965 ], - "ratio_to_vec": 2.1096544906636168 + "ratio_to_vec": 1.9099624797461328 }, { "benchmark": "retain_mixed/u64", "classification": "baseline", "implementation": "Vec", - "median_ns": 558.547422924298, + "median_ns": 559.6799238568345, "ratio_ci95": [ 1.0, 1.0 @@ -2442,51 +2442,51 @@ "benchmark": "retain_mixed/u64", "classification": "loss", "implementation": "JackVec", - "median_ns": 696.0192257807906, + "median_ns": 696.9369131455398, "ratio_ci95": [ - 1.2439124583864645, - 1.2503677637595676 + 1.2321317342147897, + 1.2497687042501886 ], - "ratio_to_vec": 1.2468670074838066 + "ratio_to_vec": 1.2458200139085445 }, { "benchmark": "retain_mixed/u64", "classification": "loss", "implementation": "ThinVec", - "median_ns": 710.6699367245966, + "median_ns": 716.8968520840458, "ratio_ci95": [ - 1.2662013473914222, - 1.27470338846449 + 1.2742554163702322, + 1.2851750090943015 ], - "ratio_to_vec": 1.2708455194172368 + "ratio_to_vec": 1.2828040116234825 }, { "benchmark": "retain_mixed/u64", "classification": "loss", "implementation": "SmallVec4", - "median_ns": 919.6149114091737, + "median_ns": 924.4324438724439, "ratio_ci95": [ - 1.642675089835722, - 1.6514855091885443 + 1.6455718784362292, + 1.6625706641390818 ], - "ratio_to_vec": 1.6450629845784999 + "ratio_to_vec": 1.6531813306765915 }, { "benchmark": "retain_mixed/u64", "classification": "loss", "implementation": "SmallVec8", - "median_ns": 926.0201425281261, + "median_ns": 926.1100667837377, "ratio_ci95": [ - 1.6540094301846155, - 1.6619662740777847 + 1.640887973754944, + 1.662709189305235 ], - "ratio_to_vec": 1.6563748382298298 + "ratio_to_vec": 1.653973713145028 }, { "benchmark": "sequential_iteration/1024", "classification": "baseline", "implementation": "Vec", - "median_ns": 58.679027102332526, + "median_ns": 102.54410800061908, "ratio_ci95": [ 1.0, 1.0 @@ -2495,53 +2495,53 @@ }, { "benchmark": "sequential_iteration/1024", - "classification": "loss", + "classification": "equivalent", "implementation": "JackVec", - "median_ns": 74.20019758151588, + "median_ns": 102.5200353017756, "ratio_ci95": [ - 1.2625127729049184, - 1.2678067738705334 + 0.998010156853741, + 1.0054949513743043 ], - "ratio_to_vec": 1.264639816174463 + "ratio_to_vec": 0.9997652454215766 }, { "benchmark": "sequential_iteration/1024", "classification": "equivalent", "implementation": "ThinVec", - "median_ns": 58.846501097126776, + "median_ns": 102.5409428525814, "ratio_ci95": [ - 1.0024326875504692, - 1.003716773822228 + 0.9997632886438483, + 1.0020994164844435 ], - "ratio_to_vec": 1.0033713254270338 + "ratio_to_vec": 0.9999843113174085 }, { "benchmark": "sequential_iteration/1024", - "classification": "loss", + "classification": "equivalent", "implementation": "SmallVec4", - "median_ns": 101.1388426433173, + "median_ns": 102.51863368162587, "ratio_ci95": [ - 1.7232528291252123, - 1.7320845310072635 + 0.9982340313098046, + 0.9999774428190341 ], - "ratio_to_vec": 1.724226780050877 + "ratio_to_vec": 0.9998442838611404 }, { "benchmark": "sequential_iteration/1024", "classification": "equivalent", "implementation": "SmallVec8", - "median_ns": 58.641435076552156, + "median_ns": 102.51817048986614, "ratio_ci95": [ - 0.9989394487291737, - 1.0001603392976162 + 0.9982116636225398, + 1.0000093796572411 ], - "ratio_to_vec": 0.9996372260746553 + "ratio_to_vec": 0.9998903250770509 }, { "benchmark": "sequential_iteration/8", "classification": "baseline", "implementation": "Vec", - "median_ns": 1.0748847172922882, + "median_ns": 1.8130193881798002, "ratio_ci95": [ 1.0, 1.0 @@ -2550,51 +2550,62 @@ }, { "benchmark": "sequential_iteration/8", - "classification": "loss", + "classification": "win", "implementation": "JackVec", - "median_ns": 1.2708135026864915, + "median_ns": 1.6565789994411733, "ratio_ci95": [ - 1.1789058856960262, - 1.184571718646692 + 0.9090008724110883, + 0.9149503127581036 ], - "ratio_to_vec": 1.182087536411812 + "ratio_to_vec": 0.9137882787837998 }, { "benchmark": "sequential_iteration/8", - "classification": "loss", + "classification": "equivalent", "implementation": "ThinVec", - "median_ns": 1.3980627805212236, + "median_ns": 1.8174344265050788, "ratio_ci95": [ - 1.2971749015293816, - 1.303584890666557 + 1.0024351853896671, + 1.0163134587696114 ], - "ratio_to_vec": 1.299999241460088 + "ratio_to_vec": 1.0027036174977584 }, { "benchmark": "sequential_iteration/8", - "classification": "loss", + "classification": "win", "implementation": "SmallVec4", - "median_ns": 1.223487804260425, + "median_ns": 1.654307784430614, "ratio_ci95": [ - 1.135031564342506, - 1.1402450757972542 + 0.9075116613801381, + 0.9139455868590667 ], - "ratio_to_vec": 1.1382502556576286 + "ratio_to_vec": 0.9117885298536805 }, { "benchmark": "sequential_iteration/8", - "classification": "equivalent", + "classification": "win", "implementation": "SmallVec8", - "median_ns": 1.0884487764363864, + "median_ns": 1.6581082018880293, "ratio_ci95": [ - 1.009276755585331, - 1.0166782963110446 + 0.9073642268961972, + 0.9165200687553093 ], - "ratio_to_vec": 1.0121023200459793 + "ratio_to_vec": 0.9153073240418217 } ], "metadata": { "affinity_cpu": 0, + "allocator": { + "effective_environment": { + "DYLD_INSERT_LIBRARIES": null, + "LD_PRELOAD": null + }, + "inherited_environment": { + "DYLD_INSERT_LIBRARIES": null, + "LD_PRELOAD": "/usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4" + }, + "policy": "system" + }, "authoritative": true, "cargo": "cargo 1.97.0 (c980f4866 2026-06-30)", "compiler_identity": { @@ -2606,15 +2617,15 @@ "release": "1.97.0" }, "cpu_summary": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 48 bits physical, 48 bits virtual\nByte Order: Little Endian\nCPU(s): 32\nOn-line CPU(s) list: 0-31\nVendor ID: AuthenticAMD\nModel name: AMD Ryzen 9 7950X3D 16-Core Processor\nCPU family: 25\nModel: 97\nThread(s) per core: 2\nCore(s) per socket: 16\nSocket(s): 1\nStepping: 2\nFrequency boost: enabled\nCPU max MHz: 5759.9639\nCPU min MHz: 3000.0000\nBogoMIPS: 8383.97\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf rapl pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt tce topoext perfctr_core perfctr_nb bpext perfctr_llc mwaitx cpb cat_l3 cdp_l3 hw_pstate ssbd mba ibrs ibpb stibp ibrs_enhanced vmmcall fsgsbase bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local avx512_bf16 clzero irperf xsaveerptr rdpru wbnoinvd cppc arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic vgif v_spec_ctrl avx512vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg avx512_vpopcntdq rdpid overflow_recov succor smca fsrm flush_l1d ibpb_exit_to_user\nVirtualization: AMD-V\nL1d cache: 512 KiB (16 instances)\nL1i cache: 512 KiB (16 instances)\nL2 cache: 16 MiB (16 instances)\nL3 cache: 128 MiB (2 instances)\nNUMA node(s): 1\nNUMA node0 CPU(s): 0-31\nVulnerability Gather data sampling: Not affected\nVulnerability Indirect target selection: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Reg file data sampling: Not affected\nVulnerability Retbleed: Not affected\nVulnerability Spec rstack overflow: Mitigation; safe RET\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Enhanced / Automatic IBRS; IBPB conditional; STIBP always-on; PBRSB-eIBRS Not affected; BHI Not affected\nVulnerability Srbds: Not affected\nVulnerability Tsa: Vulnerable: Clear CPU buffers attempted, no microcode\nVulnerability Tsx async abort: Not affected\nVulnerability Vmscape: Mitigation; IBPB before exit to userspace", - "git_commit": "1f6e5f8abac7152d6ef3523baaed63096ac88b0a", + "git_commit": "2da08eea786c9755fa6ac883026ebfc8eeeb904e", "git_dirty": false, "governor": "performance", "host_issues": [], "kernel": "Linux Ubuntu-2204-jammy-amd64-base 5.15.0-177-generic #187-Ubuntu SMP Sat Apr 11 22:54:33 UTC 2026 x86_64 x86_64 x86_64 GNU/Linux", "load_average": [ - 0.06103515625, - 0.06787109375, - 0.2255859375 + 0.4541015625, + 0.5361328125, + 0.451171875 ], "logical_cpus": 32, "machine": "x86_64", @@ -2626,136 +2637,136 @@ "cpu_idle_percent": 100.0, "label": "after-build", "load_average": [ - 0.0556640625, - 0.06640625, - 0.22412109375 + 0.91259765625, + 0.66015625, + 0.5 ], - "timestamp_utc": "2026-07-11T17:33:34.430120+00:00" + "timestamp_utc": "2026-07-11T18:37:49.104871+00:00" }, { "busy_processes": [], "cpu_idle_percent": 100.0, "label": "after-round-1", "load_average": [ - 1.12353515625, - 0.7783203125, - 0.50830078125 + 1.00341796875, + 0.90771484375, + 0.66650390625 ], - "timestamp_utc": "2026-07-11T17:39:43.225875+00:00" + "timestamp_utc": "2026-07-11T18:43:16.016885+00:00" }, { "busy_processes": [], "cpu_idle_percent": 100.0, "label": "settled-after-round-1", "load_average": [ - 1.033203125, - 0.76513671875, - 0.50537109375 + 0.9228515625, + 0.892578125, + 0.66259765625 ], - "timestamp_utc": "2026-07-11T17:39:48.252931+00:00" + "timestamp_utc": "2026-07-11T18:43:21.039409+00:00" }, { "busy_processes": [], "cpu_idle_percent": 100.0, "label": "after-round-2", "load_average": [ - 1.046875, - 0.9638671875, - 0.69091796875 + 1.00341796875, + 1.0, + 0.7919921875 ], - "timestamp_utc": "2026-07-11T17:45:58.566877+00:00" + "timestamp_utc": "2026-07-11T18:49:00.776711+00:00" }, { "busy_processes": [], "cpu_idle_percent": 100.0, "label": "settled-after-round-2", "load_average": [ - 0.962890625, - 0.94775390625, - 0.68701171875 + 0.9228515625, + 0.9833984375, + 0.78759765625 ], - "timestamp_utc": "2026-07-11T17:46:03.593165+00:00" + "timestamp_utc": "2026-07-11T18:49:05.799348+00:00" }, { "busy_processes": [], "cpu_idle_percent": 100.0, "label": "after-round-3", "load_average": [ - 1.0927734375, - 1.0166015625, - 0.81640625 + 1.17626953125, + 1.11083984375, + 0.92333984375 ], - "timestamp_utc": "2026-07-11T17:52:14.909382+00:00" + "timestamp_utc": "2026-07-11T18:54:47.287828+00:00" }, { "busy_processes": [], "cpu_idle_percent": 100.0, "label": "settled-after-round-3", "load_average": [ - 1.0048828125, - 0.99951171875, - 0.81201171875 + 1.08203125, + 1.09228515625, + 0.91796875 ], - "timestamp_utc": "2026-07-11T17:52:19.935949+00:00" + "timestamp_utc": "2026-07-11T18:54:52.310207+00:00" }, { "busy_processes": [], "cpu_idle_percent": 100.0, "label": "after-round-4", "load_average": [ - 1.06689453125, - 1.0517578125, - 0.91552734375 + 1.03955078125, + 1.0498046875, + 0.96728515625 ], - "timestamp_utc": "2026-07-11T17:58:29.260676+00:00" + "timestamp_utc": "2026-07-11T19:00:32.156962+00:00" }, { "busy_processes": [], "cpu_idle_percent": 100.0, "label": "settled-after-round-4", "load_average": [ - 0.9814453125, - 1.0341796875, - 0.91015625 + 0.9560546875, + 1.0322265625, + 0.9619140625 ], - "timestamp_utc": "2026-07-11T17:58:34.287003+00:00" + "timestamp_utc": "2026-07-11T19:00:37.179229+00:00" }, { "busy_processes": [], "cpu_idle_percent": 100.0, "label": "after-round-5", "load_average": [ - 1.00537109375, - 1.02392578125, - 0.96240234375 + 1.18017578125, + 1.10693359375, + 1.01708984375 ], - "timestamp_utc": "2026-07-11T18:04:43.517074+00:00" + "timestamp_utc": "2026-07-11T19:06:18.622430+00:00" }, { "busy_processes": [], "cpu_idle_percent": 100.0, "label": "settled-after-round-5", "load_average": [ - 0.9248046875, - 1.0068359375, - 0.95703125 + 1.08544921875, + 1.08837890625, + 1.01123046875 ], - "timestamp_utc": "2026-07-11T18:04:48.543878+00:00" + "timestamp_utc": "2026-07-11T19:06:23.644999+00:00" }, { "busy_processes": [], "cpu_idle_percent": 100.0, "label": "after-allocations", "load_average": [ - 0.93115234375, - 1.00634765625, - 0.95751953125 + 0.998046875, + 1.06982421875, + 1.00537109375 ], - "timestamp_utc": "2026-07-11T18:04:53.616669+00:00" + "timestamp_utc": "2026-07-11T19:06:28.712615+00:00" } ], "rustc": "rustc 1.97.0 (2d8144b78 2026-07-07)\nbinary: rustc\ncommit-hash: 2d8144b7880597b6e6d3dfd63a9a9efae3f533d3\ncommit-date: 2026-07-07\nhost: x86_64-unknown-linux-gnu\nrelease: 1.97.0\nLLVM version: 22.1.6", - "timestamp_utc": "2026-07-11T17:33:30.306543+00:00" + "timestamp_utc": "2026-07-11T18:36:51.049001+00:00" }, "platform_id": "linux-x86_64", "practical_equivalence_band": [ diff --git a/comparisons/benchmark-results/linux-x86_64.md b/comparisons/benchmark-results/linux-x86_64.md index 8e45974..8fccea1 100644 --- a/comparisons/benchmark-results/linux-x86_64.md +++ b/comparisons/benchmark-results/linux-x86_64.md @@ -1,8 +1,9 @@ # JackVec comparison: linux-x86_64 -Commit: `1f6e5f8abac7152d6ef3523baaed63096ac88b0a` -Rust: `rustc 1.97.0 (2d8144b78 2026-07-07)` -Platform: `Linux-5.15.0-177-generic-x86_64-with-glibc2.35` +- Commit: `2da08eea786c9755fa6ac883026ebfc8eeeb904e` +- Rust: `rustc 1.97.0 (2d8144b78 2026-07-07)` +- Platform: `Linux-5.15.0-177-generic-x86_64-with-glibc2.35` +- Allocator policy: `system`; effective override environment: `{'LD_PRELOAD': None, 'DYLD_INSERT_LIBRARIES': None}` Rounds: 5; practical-equivalence band: 0.97–1.03× Vec. A win or loss requires the complete paired bootstrap interval to clear the practical-equivalence band. Results that cross a boundary are reported as inconclusive. @@ -11,116 +12,116 @@ A win or loss requires the complete paired bootstrap interval to clear the pract | Benchmark | Implementation | Median ns | Ratio | 95% interval | Result | |---|---:|---:|---:|---:|---| -| append_preallocated/1024 | Vec | 161.775 | 1.000× | 1.000–1.000× | baseline | -| append_preallocated/1024 | JackVec | 163.955 | 1.015× | 0.997–1.022× | equivalent | -| append_preallocated/1024 | ThinVec | 508.776 | 3.145× | 3.126–3.193× | loss | -| append_preallocated/1024 | SmallVec4 | 192.696 | 1.194× | 1.177–1.228× | loss | -| append_preallocated/1024 | SmallVec8 | 208.087 | 1.287× | 1.278–1.299× | loss | -| append_preallocated/4 | Vec | 2.589 | 1.000× | 1.000–1.000× | baseline | -| append_preallocated/4 | JackVec | 3.719 | 1.436× | 1.433–1.482× | loss | -| append_preallocated/4 | ThinVec | 4.116 | 1.586× | 1.567–1.618× | loss | -| append_preallocated/4 | SmallVec4 | 5.723 | 2.211× | 2.205–2.214× | loss | -| append_preallocated/4 | SmallVec8 | 5.710 | 2.200× | 2.193–2.209× | loss | -| build_growing_and_drop/1 | Vec | 8.312 | 1.000× | 1.000–1.000× | baseline | -| build_growing_and_drop/1 | JackVec | 7.683 | 0.927× | 0.922–0.938× | win | -| build_growing_and_drop/1 | ThinVec | 7.659 | 0.922× | 0.921–0.927× | win | -| build_growing_and_drop/1 | SmallVec4 | 2.054 | 0.247× | 0.241–0.249× | win | -| build_growing_and_drop/1 | SmallVec8 | 3.205 | 0.379× | 0.376–0.388× | win | -| build_growing_and_drop/1024 | Vec | 678.735 | 1.000× | 1.000–1.000× | baseline | -| build_growing_and_drop/1024 | JackVec | 562.051 | 0.827× | 0.817–0.845× | win | -| build_growing_and_drop/1024 | ThinVec | 550.895 | 0.811× | 0.802–0.830× | win | -| build_growing_and_drop/1024 | SmallVec4 | 1002.856 | 1.478× | 1.466–1.510× | loss | -| build_growing_and_drop/1024 | SmallVec8 | 1006.023 | 1.475× | 1.427–1.507× | loss | -| build_growing_and_drop/4 | Vec | 9.266 | 1.000× | 1.000–1.000× | baseline | -| build_growing_and_drop/4 | JackVec | 8.947 | 0.969× | 0.957–0.980× | inconclusive | -| build_growing_and_drop/4 | ThinVec | 8.468 | 0.923× | 0.892–0.935× | win | -| build_growing_and_drop/4 | SmallVec4 | 10.868 | 1.173× | 1.169–1.189× | loss | -| build_growing_and_drop/4 | SmallVec8 | 8.724 | 0.941× | 0.928–1.009× | inconclusive | -| dedup_adjacent_pairs/64_byte | Vec | 967.355 | 1.000× | 1.000–1.000× | baseline | -| dedup_adjacent_pairs/64_byte | JackVec | 1039.235 | 1.073× | 1.071–1.076× | loss | -| dedup_adjacent_pairs/64_byte | ThinVec | 1006.277 | 1.040× | 1.039–1.042× | loss | -| dedup_adjacent_pairs/64_byte | SmallVec4 | 1144.656 | 1.183× | 1.179–1.198× | loss | -| dedup_adjacent_pairs/64_byte | SmallVec8 | 1147.124 | 1.186× | 1.182–1.197× | loss | -| dedup_adjacent_pairs/u64 | Vec | 267.912 | 1.000× | 1.000–1.000× | baseline | -| dedup_adjacent_pairs/u64 | JackVec | 282.549 | 1.059× | 1.002–1.067× | inconclusive | -| dedup_adjacent_pairs/u64 | ThinVec | 369.631 | 1.384× | 1.376–1.548× | loss | -| dedup_adjacent_pairs/u64 | SmallVec4 | 447.886 | 1.659× | 1.589–2.044× | loss | -| dedup_adjacent_pairs/u64 | SmallVec8 | 367.336 | 1.374× | 1.307–1.384× | loss | -| extend_reserved_1024 | Vec | 152.208 | 1.000× | 1.000–1.000× | baseline | -| extend_reserved_1024 | JackVec | 164.931 | 1.072× | 1.038–1.113× | loss | -| extend_reserved_1024 | ThinVec | 155.382 | 1.021× | 0.977–1.059× | inconclusive | -| extend_reserved_1024 | SmallVec4 | 148.660 | 1.001× | 0.929–1.021× | inconclusive | -| extend_reserved_1024 | SmallVec8 | 160.759 | 1.044× | 0.988–1.078× | inconclusive | -| nested_construct_and_drop/empty | Vec | 18932.942 | 1.000× | 1.000–1.000× | baseline | -| nested_construct_and_drop/empty | JackVec | 12071.659 | 0.635× | 0.575–0.639× | win | -| nested_construct_and_drop/empty | ThinVec | 10761.009 | 0.565× | 0.503–0.570× | win | -| nested_construct_and_drop/empty | SmallVec4 | 21602.297 | 1.143× | 1.127–1.154× | loss | -| nested_construct_and_drop/empty | SmallVec8 | 27141.307 | 1.437× | 1.432–1.443× | loss | -| nested_construct_and_drop/small | Vec | 113911.536 | 1.000× | 1.000–1.000× | baseline | -| nested_construct_and_drop/small | JackVec | 108169.508 | 0.948× | 0.935–0.955× | win | -| nested_construct_and_drop/small | ThinVec | 103041.828 | 0.905× | 0.891–0.917× | win | -| nested_construct_and_drop/small | SmallVec4 | 126057.111 | 1.107× | 1.101–1.112× | loss | -| nested_construct_and_drop/small | SmallVec8 | 133435.798 | 1.170× | 1.160–1.180× | loss | -| nested_construct_and_drop/sparse | Vec | 37194.696 | 1.000× | 1.000–1.000× | baseline | -| nested_construct_and_drop/sparse | JackVec | 32354.043 | 0.874× | 0.861–0.877× | win | -| nested_construct_and_drop/sparse | ThinVec | 30068.761 | 0.811× | 0.782–0.813× | win | -| nested_construct_and_drop/sparse | SmallVec4 | 40198.086 | 1.080× | 1.078–1.084× | loss | -| nested_construct_and_drop/sparse | SmallVec8 | 45716.869 | 1.227× | 1.202–1.241× | loss | -| nested_metadata_scan_sparse | Vec | 3971.005 | 1.000× | 1.000–1.000× | baseline | -| nested_metadata_scan_sparse | JackVec | 4025.529 | 1.015× | 1.013–1.057× | inconclusive | -| nested_metadata_scan_sparse | ThinVec | 4018.097 | 1.013× | 1.008–1.040× | inconclusive | -| nested_metadata_scan_sparse | SmallVec4 | 4085.277 | 1.028× | 1.027–1.063× | inconclusive | -| nested_metadata_scan_sparse | SmallVec8 | 5346.578 | 1.346× | 1.260–1.392× | loss | -| nested_traverse/empty | Vec | 2197.898 | 1.000× | 1.000–1.000× | baseline | -| nested_traverse/empty | JackVec | 2152.744 | 0.980× | 0.979–0.984× | equivalent | -| nested_traverse/empty | ThinVec | 3955.254 | 1.804× | 1.799–1.811× | loss | -| nested_traverse/empty | SmallVec4 | 5873.415 | 2.678× | 1.840–2.684× | loss | -| nested_traverse/empty | SmallVec8 | 6001.315 | 2.737× | 2.187–2.759× | loss | -| nested_traverse/small | Vec | 21533.945 | 1.000× | 1.000–1.000× | baseline | -| nested_traverse/small | JackVec | 21523.874 | 0.999× | 0.985–1.003× | equivalent | -| nested_traverse/small | ThinVec | 21521.787 | 0.999× | 0.985–1.000× | equivalent | -| nested_traverse/small | SmallVec4 | 21421.319 | 0.994× | 0.985–0.997× | equivalent | -| nested_traverse/small | SmallVec8 | 21429.866 | 0.995× | 0.983–0.998× | equivalent | -| nested_traverse/sparse | Vec | 3242.745 | 1.000× | 1.000–1.000× | baseline | -| nested_traverse/sparse | JackVec | 3055.728 | 0.945× | 0.827–0.994× | inconclusive | -| nested_traverse/sparse | ThinVec | 5241.989 | 1.623× | 1.380–1.706× | loss | -| nested_traverse/sparse | SmallVec4 | 5045.058 | 1.555× | 1.327–1.643× | loss | -| nested_traverse/sparse | SmallVec8 | 5493.643 | 1.667× | 1.476–1.754× | loss | -| push_preallocated/1024 | Vec | 439.968 | 1.000× | 1.000–1.000× | baseline | -| push_preallocated/1024 | JackVec | 432.513 | 0.986× | 0.977–0.998× | equivalent | -| push_preallocated/1024 | ThinVec | 428.796 | 0.974× | 0.964–0.983× | inconclusive | -| push_preallocated/1024 | SmallVec4 | 714.322 | 1.623× | 1.617–1.643× | loss | -| push_preallocated/1024 | SmallVec8 | 717.536 | 1.630× | 1.626–1.640× | loss | -| push_preallocated/4 | Vec | 2.274 | 1.000× | 1.000–1.000× | baseline | -| push_preallocated/4 | JackVec | 2.103 | 0.920× | 0.911–0.931× | win | -| push_preallocated/4 | ThinVec | 2.117 | 0.932× | 0.917–0.945× | win | -| push_preallocated/4 | SmallVec4 | 14.058 | 6.135× | 6.097–6.221× | loss | -| push_preallocated/4 | SmallVec8 | 14.102 | 6.207× | 6.105–6.253× | loss | -| resize_reserved_1024 | Vec | 154.655 | 1.000× | 1.000–1.000× | baseline | -| resize_reserved_1024 | JackVec | 165.592 | 1.071× | 1.014–1.107× | inconclusive | -| resize_reserved_1024 | ThinVec | 437.112 | 2.830× | 2.793–2.917× | loss | -| resize_reserved_1024 | SmallVec4 | 153.335 | 0.982× | 0.939–1.053× | inconclusive | -| resize_reserved_1024 | SmallVec8 | 154.313 | 1.004× | 0.941–1.039× | inconclusive | -| retain_mixed/64_byte | Vec | 252.494 | 1.000× | 1.000–1.000× | baseline | -| retain_mixed/64_byte | JackVec | 294.815 | 1.163× | 1.158–1.194× | loss | -| retain_mixed/64_byte | ThinVec | 445.460 | 1.768× | 1.760–1.785× | loss | -| retain_mixed/64_byte | SmallVec4 | 526.996 | 2.089× | 2.076–2.127× | loss | -| retain_mixed/64_byte | SmallVec8 | 531.974 | 2.110× | 2.098–2.120× | loss | -| retain_mixed/u64 | Vec | 558.547 | 1.000× | 1.000–1.000× | baseline | -| retain_mixed/u64 | JackVec | 696.019 | 1.247× | 1.244–1.250× | loss | -| retain_mixed/u64 | ThinVec | 710.670 | 1.271× | 1.266–1.275× | loss | -| retain_mixed/u64 | SmallVec4 | 919.615 | 1.645× | 1.643–1.651× | loss | -| retain_mixed/u64 | SmallVec8 | 926.020 | 1.656× | 1.654–1.662× | loss | -| sequential_iteration/1024 | Vec | 58.679 | 1.000× | 1.000–1.000× | baseline | -| sequential_iteration/1024 | JackVec | 74.200 | 1.265× | 1.263–1.268× | loss | -| sequential_iteration/1024 | ThinVec | 58.847 | 1.003× | 1.002–1.004× | equivalent | -| sequential_iteration/1024 | SmallVec4 | 101.139 | 1.724× | 1.723–1.732× | loss | -| sequential_iteration/1024 | SmallVec8 | 58.641 | 1.000× | 0.999–1.000× | equivalent | -| sequential_iteration/8 | Vec | 1.075 | 1.000× | 1.000–1.000× | baseline | -| sequential_iteration/8 | JackVec | 1.271 | 1.182× | 1.179–1.185× | loss | -| sequential_iteration/8 | ThinVec | 1.398 | 1.300× | 1.297–1.304× | loss | -| sequential_iteration/8 | SmallVec4 | 1.223 | 1.138× | 1.135–1.140× | loss | -| sequential_iteration/8 | SmallVec8 | 1.088 | 1.012× | 1.009–1.017× | equivalent | +| append_preallocated/1024 | Vec | 160.173 | 1.000× | 1.000–1.000× | baseline | +| append_preallocated/1024 | JackVec | 163.412 | 1.018× | 1.017–1.033× | inconclusive | +| append_preallocated/1024 | ThinVec | 521.598 | 3.271× | 3.205–3.273× | loss | +| append_preallocated/1024 | SmallVec4 | 210.064 | 1.316× | 1.285–1.320× | loss | +| append_preallocated/1024 | SmallVec8 | 196.384 | 1.231× | 1.217–1.240× | loss | +| append_preallocated/4 | Vec | 2.794 | 1.000× | 1.000–1.000× | baseline | +| append_preallocated/4 | JackVec | 3.728 | 1.330× | 1.300–1.348× | loss | +| append_preallocated/4 | ThinVec | 4.318 | 1.551× | 1.538–1.557× | loss | +| append_preallocated/4 | SmallVec4 | 5.722 | 2.047× | 2.031–2.061× | loss | +| append_preallocated/4 | SmallVec8 | 5.704 | 2.049× | 2.019–2.148× | loss | +| build_growing_and_drop/1 | Vec | 11.491 | 1.000× | 1.000–1.000× | baseline | +| build_growing_and_drop/1 | JackVec | 10.905 | 0.947× | 0.917–0.959× | win | +| build_growing_and_drop/1 | ThinVec | 10.516 | 0.907× | 0.882–0.940× | win | +| build_growing_and_drop/1 | SmallVec4 | 2.054 | 0.179× | 0.177–0.180× | win | +| build_growing_and_drop/1 | SmallVec8 | 3.213 | 0.278× | 0.275–0.283× | win | +| build_growing_and_drop/1024 | Vec | 699.856 | 1.000× | 1.000–1.000× | baseline | +| build_growing_and_drop/1024 | JackVec | 611.927 | 0.874× | 0.785–1.069× | inconclusive | +| build_growing_and_drop/1024 | ThinVec | 557.191 | 0.804× | 0.763–0.968× | win | +| build_growing_and_drop/1024 | SmallVec4 | 933.890 | 1.476× | 1.325–1.619× | loss | +| build_growing_and_drop/1024 | SmallVec8 | 929.484 | 1.432× | 1.278–1.495× | loss | +| build_growing_and_drop/4 | Vec | 12.383 | 1.000× | 1.000–1.000× | baseline | +| build_growing_and_drop/4 | JackVec | 11.622 | 0.938× | 0.922–0.940× | win | +| build_growing_and_drop/4 | ThinVec | 11.368 | 0.910× | 0.909–0.954× | win | +| build_growing_and_drop/4 | SmallVec4 | 10.901 | 0.880× | 0.858–0.882× | win | +| build_growing_and_drop/4 | SmallVec8 | 9.186 | 0.742× | 0.693–0.794× | win | +| dedup_adjacent_pairs/64_byte | Vec | 972.739 | 1.000× | 1.000–1.000× | baseline | +| dedup_adjacent_pairs/64_byte | JackVec | 1070.404 | 1.100× | 1.098–1.100× | loss | +| dedup_adjacent_pairs/64_byte | ThinVec | 1097.902 | 1.130× | 1.081–1.134× | loss | +| dedup_adjacent_pairs/64_byte | SmallVec4 | 1099.313 | 1.131× | 1.127–1.139× | loss | +| dedup_adjacent_pairs/64_byte | SmallVec8 | 1098.761 | 1.131× | 1.128–1.135× | loss | +| dedup_adjacent_pairs/u64 | Vec | 307.613 | 1.000× | 1.000–1.000× | baseline | +| dedup_adjacent_pairs/u64 | JackVec | 328.872 | 1.069× | 1.042–1.096× | loss | +| dedup_adjacent_pairs/u64 | ThinVec | 524.800 | 1.693× | 1.387–1.717× | loss | +| dedup_adjacent_pairs/u64 | SmallVec4 | 396.146 | 1.281× | 1.250–1.323× | loss | +| dedup_adjacent_pairs/u64 | SmallVec8 | 397.971 | 1.290× | 1.263–1.332× | loss | +| extend_reserved_1024 | Vec | 154.130 | 1.000× | 1.000–1.000× | baseline | +| extend_reserved_1024 | JackVec | 159.464 | 1.035× | 1.012–1.053× | inconclusive | +| extend_reserved_1024 | ThinVec | 149.007 | 0.964× | 0.938–0.972× | inconclusive | +| extend_reserved_1024 | SmallVec4 | 184.075 | 1.194× | 1.160–1.200× | loss | +| extend_reserved_1024 | SmallVec8 | 182.017 | 1.183× | 1.146–1.189× | loss | +| nested_construct_and_drop/empty | Vec | 18959.341 | 1.000× | 1.000–1.000× | baseline | +| nested_construct_and_drop/empty | JackVec | 9642.449 | 0.511× | 0.500–0.568× | win | +| nested_construct_and_drop/empty | ThinVec | 10747.226 | 0.570× | 0.565–0.576× | win | +| nested_construct_and_drop/empty | SmallVec4 | 22251.789 | 1.176× | 1.170–1.204× | loss | +| nested_construct_and_drop/empty | SmallVec8 | 27187.117 | 1.447× | 1.426–1.458× | loss | +| nested_construct_and_drop/small | Vec | 226517.114 | 1.000× | 1.000–1.000× | baseline | +| nested_construct_and_drop/small | JackVec | 213288.409 | 0.944× | 0.897–0.946× | win | +| nested_construct_and_drop/small | ThinVec | 214035.345 | 0.946× | 0.894–0.948× | win | +| nested_construct_and_drop/small | SmallVec4 | 128721.890 | 0.568× | 0.557–0.571× | win | +| nested_construct_and_drop/small | SmallVec8 | 131863.728 | 0.583× | 0.568–0.586× | win | +| nested_construct_and_drop/sparse | Vec | 63121.480 | 1.000× | 1.000–1.000× | baseline | +| nested_construct_and_drop/sparse | JackVec | 56704.910 | 0.892× | 0.887–0.914× | win | +| nested_construct_and_drop/sparse | ThinVec | 54584.925 | 0.862× | 0.848–0.878× | win | +| nested_construct_and_drop/sparse | SmallVec4 | 40560.407 | 0.642× | 0.629–0.654× | win | +| nested_construct_and_drop/sparse | SmallVec8 | 45610.577 | 0.717× | 0.710–0.726× | win | +| nested_metadata_scan_sparse | Vec | 3973.003 | 1.000× | 1.000–1.000× | baseline | +| nested_metadata_scan_sparse | JackVec | 4003.828 | 1.010× | 1.007–1.015× | equivalent | +| nested_metadata_scan_sparse | ThinVec | 4003.677 | 1.007× | 1.006–1.013× | equivalent | +| nested_metadata_scan_sparse | SmallVec4 | 4156.714 | 1.051× | 1.016–1.058× | inconclusive | +| nested_metadata_scan_sparse | SmallVec8 | 5112.391 | 1.292× | 1.250–1.340× | loss | +| nested_traverse/empty | Vec | 2191.751 | 1.000× | 1.000–1.000× | baseline | +| nested_traverse/empty | JackVec | 2153.251 | 0.982× | 0.982–0.985× | equivalent | +| nested_traverse/empty | ThinVec | 2155.136 | 0.983× | 0.982–0.985× | equivalent | +| nested_traverse/empty | SmallVec4 | 5875.006 | 2.681× | 2.679–2.692× | loss | +| nested_traverse/empty | SmallVec8 | 6052.416 | 2.761× | 2.730–2.767× | loss | +| nested_traverse/small | Vec | 21414.993 | 1.000× | 1.000–1.000× | baseline | +| nested_traverse/small | JackVec | 21420.348 | 1.000× | 1.000–1.009× | equivalent | +| nested_traverse/small | ThinVec | 21424.411 | 1.000× | 0.996–1.004× | equivalent | +| nested_traverse/small | SmallVec4 | 21418.573 | 1.000× | 1.000–1.000× | equivalent | +| nested_traverse/small | SmallVec8 | 21419.927 | 1.000× | 0.999–1.001× | equivalent | +| nested_traverse/sparse | Vec | 3087.824 | 1.000× | 1.000–1.000× | baseline | +| nested_traverse/sparse | JackVec | 3082.562 | 0.999× | 0.983–1.012× | equivalent | +| nested_traverse/sparse | ThinVec | 3092.109 | 0.999× | 0.993–1.026× | equivalent | +| nested_traverse/sparse | SmallVec4 | 6880.874 | 2.228× | 2.213–2.233× | loss | +| nested_traverse/sparse | SmallVec8 | 5362.402 | 1.732× | 1.714–1.805× | loss | +| push_preallocated/1024 | Vec | 448.354 | 1.000× | 1.000–1.000× | baseline | +| push_preallocated/1024 | JackVec | 427.537 | 0.952× | 0.950–0.954× | win | +| push_preallocated/1024 | ThinVec | 421.012 | 0.938× | 0.925–0.944× | win | +| push_preallocated/1024 | SmallVec4 | 718.665 | 1.603× | 1.593–1.609× | loss | +| push_preallocated/1024 | SmallVec8 | 724.131 | 1.620× | 1.612–1.638× | loss | +| push_preallocated/4 | Vec | 2.442 | 1.000× | 1.000–1.000× | baseline | +| push_preallocated/4 | JackVec | 2.151 | 0.882× | 0.859–0.897× | win | +| push_preallocated/4 | ThinVec | 2.254 | 0.930× | 0.905–0.936× | win | +| push_preallocated/4 | SmallVec4 | 14.155 | 5.812× | 5.657–5.940× | loss | +| push_preallocated/4 | SmallVec8 | 14.187 | 5.820× | 5.700–5.974× | loss | +| resize_reserved_1024 | Vec | 144.512 | 1.000× | 1.000–1.000× | baseline | +| resize_reserved_1024 | JackVec | 154.230 | 1.067× | 1.055–1.077× | loss | +| resize_reserved_1024 | ThinVec | 429.145 | 2.970× | 2.937–3.006× | loss | +| resize_reserved_1024 | SmallVec4 | 144.214 | 0.996× | 0.987–1.017× | equivalent | +| resize_reserved_1024 | SmallVec8 | 144.066 | 1.000× | 0.948–1.009× | inconclusive | +| retain_mixed/64_byte | Vec | 287.639 | 1.000× | 1.000–1.000× | baseline | +| retain_mixed/64_byte | JackVec | 316.699 | 1.105× | 1.100–1.120× | loss | +| retain_mixed/64_byte | ThinVec | 444.747 | 1.546× | 1.529–1.611× | loss | +| retain_mixed/64_byte | SmallVec4 | 553.008 | 1.926× | 1.889–1.967× | loss | +| retain_mixed/64_byte | SmallVec8 | 547.569 | 1.910× | 1.880–1.920× | loss | +| retain_mixed/u64 | Vec | 559.680 | 1.000× | 1.000–1.000× | baseline | +| retain_mixed/u64 | JackVec | 696.937 | 1.246× | 1.232–1.250× | loss | +| retain_mixed/u64 | ThinVec | 716.897 | 1.283× | 1.274–1.285× | loss | +| retain_mixed/u64 | SmallVec4 | 924.432 | 1.653× | 1.646–1.663× | loss | +| retain_mixed/u64 | SmallVec8 | 926.110 | 1.654× | 1.641–1.663× | loss | +| sequential_iteration/1024 | Vec | 102.544 | 1.000× | 1.000–1.000× | baseline | +| sequential_iteration/1024 | JackVec | 102.520 | 1.000× | 0.998–1.005× | equivalent | +| sequential_iteration/1024 | ThinVec | 102.541 | 1.000× | 1.000–1.002× | equivalent | +| sequential_iteration/1024 | SmallVec4 | 102.519 | 1.000× | 0.998–1.000× | equivalent | +| sequential_iteration/1024 | SmallVec8 | 102.518 | 1.000× | 0.998–1.000× | equivalent | +| sequential_iteration/8 | Vec | 1.813 | 1.000× | 1.000–1.000× | baseline | +| sequential_iteration/8 | JackVec | 1.657 | 0.914× | 0.909–0.915× | win | +| sequential_iteration/8 | ThinVec | 1.817 | 1.003× | 1.002–1.016× | equivalent | +| sequential_iteration/8 | SmallVec4 | 1.654 | 0.912× | 0.908–0.914× | win | +| sequential_iteration/8 | SmallVec8 | 1.658 | 0.915× | 0.907–0.917× | win | ## Allocations @@ -128,63 +129,63 @@ Owner bytes describe the collection values themselves. Requested and usable byte | Benchmark | Input | Element B | Implementation | Owner B | Live requested B | Live usable B | Allocs | Reallocs | Spilled | |---|---:|---:|---|---:|---:|---:|---:|---:|---:| -| nested | empty | 8 | Vec | 240000 | 240000 | 245760 | 1 | 0 | na | -| nested | empty | 8 | JackVec | 80000 | 80000 | 81920 | 1 | 0 | na | -| nested | empty | 8 | ThinVec | 80000 | 80000 | 81920 | 1 | 0 | na | -| nested | empty | 8 | SmallVec4 | 400000 | 400000 | 401408 | 1 | 0 | 0 | -| nested | empty | 8 | SmallVec8 | 720000 | 720000 | 720896 | 1 | 0 | 0 | -| nested | sparse | 8 | Vec | 240000 | 304000 | 309760 | 2001 | 0 | na | -| nested | sparse | 8 | JackVec | 80000 | 160000 | 177920 | 2001 | 0 | na | -| nested | sparse | 8 | ThinVec | 80000 | 176000 | 177920 | 2001 | 0 | na | -| nested | sparse | 8 | SmallVec4 | 400000 | 400000 | 401408 | 1 | 0 | 0 | -| nested | sparse | 8 | SmallVec8 | 720000 | 720000 | 720896 | 1 | 0 | 0 | -| nested | small | 8 | Vec | 240000 | 560000 | 565760 | 10001 | 0 | na | -| nested | small | 8 | JackVec | 80000 | 480000 | 561920 | 10001 | 0 | na | -| nested | small | 8 | ThinVec | 80000 | 560000 | 561920 | 10001 | 0 | na | -| nested | small | 8 | SmallVec4 | 400000 | 400000 | 401408 | 1 | 0 | 0 | -| nested | small | 8 | SmallVec8 | 720000 | 720000 | 720896 | 1 | 0 | 0 | -| build_growing | 1 | 8 | Vec | 24 | 32 | 32 | 1 | 0 | na | -| build_growing | 1 | 8 | JackVec | 8 | 40 | 48 | 1 | 0 | na | -| build_growing | 1 | 8 | ThinVec | 8 | 48 | 48 | 1 | 0 | na | +| nested | empty | 8 | Vec | 240000 | 240000 | 241648 | 1 | 0 | na | +| nested | empty | 8 | JackVec | 80000 | 80000 | 80008 | 1 | 0 | na | +| nested | empty | 8 | ThinVec | 80000 | 80000 | 80008 | 1 | 0 | na | +| nested | empty | 8 | SmallVec4 | 400000 | 400000 | 401392 | 1 | 0 | 0 | +| nested | empty | 8 | SmallVec8 | 720000 | 720000 | 720880 | 1 | 0 | 0 | +| nested | sparse | 8 | Vec | 240000 | 304000 | 320008 | 2001 | 0 | na | +| nested | sparse | 8 | JackVec | 80000 | 160000 | 160008 | 2001 | 0 | na | +| nested | sparse | 8 | ThinVec | 80000 | 176000 | 192008 | 2001 | 0 | na | +| nested | sparse | 8 | SmallVec4 | 400000 | 400000 | 400008 | 1 | 0 | 0 | +| nested | sparse | 8 | SmallVec8 | 720000 | 720000 | 720008 | 1 | 0 | 0 | +| nested | small | 8 | Vec | 240000 | 560000 | 640024 | 10001 | 0 | na | +| nested | small | 8 | JackVec | 80000 | 480000 | 480024 | 10001 | 0 | na | +| nested | small | 8 | ThinVec | 80000 | 560000 | 640024 | 10001 | 0 | na | +| nested | small | 8 | SmallVec4 | 400000 | 400000 | 400008 | 1 | 0 | 0 | +| nested | small | 8 | SmallVec8 | 720000 | 720000 | 720008 | 1 | 0 | 0 | +| build_growing | 1 | 8 | Vec | 24 | 32 | 40 | 1 | 0 | na | +| build_growing | 1 | 8 | JackVec | 8 | 40 | 40 | 1 | 0 | na | +| build_growing | 1 | 8 | ThinVec | 8 | 48 | 56 | 1 | 0 | na | | build_growing | 1 | 8 | SmallVec4 | 40 | 0 | 0 | 0 | 0 | 0 | | build_growing | 1 | 8 | SmallVec8 | 72 | 0 | 0 | 0 | 0 | 0 | -| push_reserved | 1 | 8 | Vec | 24 | 8 | 8 | 1 | 0 | na | -| push_reserved | 1 | 8 | JackVec | 8 | 16 | 16 | 1 | 0 | na | -| push_reserved | 1 | 8 | ThinVec | 8 | 24 | 32 | 1 | 0 | na | +| push_reserved | 1 | 8 | Vec | 24 | 8 | 24 | 1 | 0 | na | +| push_reserved | 1 | 8 | JackVec | 8 | 16 | 24 | 1 | 0 | na | +| push_reserved | 1 | 8 | ThinVec | 8 | 24 | 24 | 1 | 0 | na | | push_reserved | 1 | 8 | SmallVec4 | 40 | 0 | 0 | 0 | 0 | 0 | | push_reserved | 1 | 8 | SmallVec8 | 72 | 0 | 0 | 0 | 0 | 0 | -| push_reserved | 1 | 1 | Vec | 24 | 1 | 8 | 1 | 0 | na | -| push_reserved | 1 | 1 | JackVec | 8 | 9 | 16 | 1 | 0 | na | -| push_reserved | 1 | 1 | ThinVec | 8 | 17 | 32 | 1 | 0 | na | +| push_reserved | 1 | 1 | Vec | 24 | 1 | 24 | 1 | 0 | na | +| push_reserved | 1 | 1 | JackVec | 8 | 9 | 24 | 1 | 0 | na | +| push_reserved | 1 | 1 | ThinVec | 8 | 17 | 24 | 1 | 0 | na | | push_reserved | 1 | 1 | SmallVec4 | 24 | 0 | 0 | 0 | 0 | 0 | | push_reserved | 1 | 1 | SmallVec8 | 24 | 0 | 0 | 0 | 0 | 0 | -| build_growing | 4 | 8 | Vec | 24 | 32 | 32 | 1 | 0 | na | -| build_growing | 4 | 8 | JackVec | 8 | 40 | 48 | 1 | 0 | na | -| build_growing | 4 | 8 | ThinVec | 8 | 48 | 48 | 1 | 0 | na | +| build_growing | 4 | 8 | Vec | 24 | 32 | 40 | 1 | 0 | na | +| build_growing | 4 | 8 | JackVec | 8 | 40 | 40 | 1 | 0 | na | +| build_growing | 4 | 8 | ThinVec | 8 | 48 | 56 | 1 | 0 | na | | build_growing | 4 | 8 | SmallVec4 | 40 | 0 | 0 | 0 | 0 | 0 | | build_growing | 4 | 8 | SmallVec8 | 72 | 0 | 0 | 0 | 0 | 0 | -| push_reserved | 4 | 8 | Vec | 24 | 32 | 32 | 1 | 0 | na | -| push_reserved | 4 | 8 | JackVec | 8 | 40 | 48 | 1 | 0 | na | -| push_reserved | 4 | 8 | ThinVec | 8 | 48 | 48 | 1 | 0 | na | +| push_reserved | 4 | 8 | Vec | 24 | 32 | 40 | 1 | 0 | na | +| push_reserved | 4 | 8 | JackVec | 8 | 40 | 40 | 1 | 0 | na | +| push_reserved | 4 | 8 | ThinVec | 8 | 48 | 56 | 1 | 0 | na | | push_reserved | 4 | 8 | SmallVec4 | 40 | 0 | 0 | 0 | 0 | 0 | | push_reserved | 4 | 8 | SmallVec8 | 72 | 0 | 0 | 0 | 0 | 0 | -| push_reserved | 4 | 1 | Vec | 24 | 4 | 8 | 1 | 0 | na | -| push_reserved | 4 | 1 | JackVec | 8 | 12 | 16 | 1 | 0 | na | -| push_reserved | 4 | 1 | ThinVec | 8 | 20 | 32 | 1 | 0 | na | +| push_reserved | 4 | 1 | Vec | 24 | 4 | 24 | 1 | 0 | na | +| push_reserved | 4 | 1 | JackVec | 8 | 12 | 24 | 1 | 0 | na | +| push_reserved | 4 | 1 | ThinVec | 8 | 20 | 24 | 1 | 0 | na | | push_reserved | 4 | 1 | SmallVec4 | 24 | 0 | 0 | 0 | 0 | 0 | | push_reserved | 4 | 1 | SmallVec8 | 24 | 0 | 0 | 0 | 0 | 0 | -| build_growing | 1024 | 8 | Vec | 24 | 8192 | 8192 | 1 | 8 | na | -| build_growing | 1024 | 8 | JackVec | 8 | 8200 | 9216 | 1 | 8 | na | -| build_growing | 1024 | 8 | ThinVec | 8 | 8208 | 9216 | 1 | 8 | na | -| build_growing | 1024 | 8 | SmallVec4 | 40 | 8192 | 8192 | 1 | 7 | 1 | -| build_growing | 1024 | 8 | SmallVec8 | 72 | 8192 | 8192 | 1 | 6 | 1 | -| push_reserved | 1024 | 8 | Vec | 24 | 8192 | 8192 | 1 | 0 | na | -| push_reserved | 1024 | 8 | JackVec | 8 | 8200 | 9216 | 1 | 0 | na | -| push_reserved | 1024 | 8 | ThinVec | 8 | 8208 | 9216 | 1 | 0 | na | -| push_reserved | 1024 | 8 | SmallVec4 | 40 | 8192 | 8192 | 1 | 0 | 1 | -| push_reserved | 1024 | 8 | SmallVec8 | 72 | 8192 | 8192 | 1 | 0 | 1 | -| push_reserved | 1024 | 1 | Vec | 24 | 1024 | 1024 | 1 | 0 | na | -| push_reserved | 1024 | 1 | JackVec | 8 | 1032 | 1152 | 1 | 0 | na | -| push_reserved | 1024 | 1 | ThinVec | 8 | 1040 | 1152 | 1 | 0 | na | -| push_reserved | 1024 | 1 | SmallVec4 | 24 | 1024 | 1024 | 1 | 0 | 1 | -| push_reserved | 1024 | 1 | SmallVec8 | 24 | 1024 | 1024 | 1 | 0 | 1 | +| build_growing | 1024 | 8 | Vec | 24 | 8192 | 8200 | 1 | 8 | na | +| build_growing | 1024 | 8 | JackVec | 8 | 8200 | 8200 | 1 | 8 | na | +| build_growing | 1024 | 8 | ThinVec | 8 | 8208 | 8216 | 1 | 8 | na | +| build_growing | 1024 | 8 | SmallVec4 | 40 | 8192 | 8200 | 1 | 7 | 1 | +| build_growing | 1024 | 8 | SmallVec8 | 72 | 8192 | 8200 | 1 | 6 | 1 | +| push_reserved | 1024 | 8 | Vec | 24 | 8192 | 8200 | 1 | 0 | na | +| push_reserved | 1024 | 8 | JackVec | 8 | 8200 | 8200 | 1 | 0 | na | +| push_reserved | 1024 | 8 | ThinVec | 8 | 8208 | 8216 | 1 | 0 | na | +| push_reserved | 1024 | 8 | SmallVec4 | 40 | 8192 | 8200 | 1 | 0 | 1 | +| push_reserved | 1024 | 8 | SmallVec8 | 72 | 8192 | 8200 | 1 | 0 | 1 | +| push_reserved | 1024 | 1 | Vec | 24 | 1024 | 1032 | 1 | 0 | na | +| push_reserved | 1024 | 1 | JackVec | 8 | 1032 | 1032 | 1 | 0 | na | +| push_reserved | 1024 | 1 | ThinVec | 8 | 1040 | 1048 | 1 | 0 | na | +| push_reserved | 1024 | 1 | SmallVec4 | 24 | 1024 | 1032 | 1 | 0 | 1 | +| push_reserved | 1024 | 1 | SmallVec8 | 24 | 1024 | 1032 | 1 | 0 | 1 | diff --git a/comparisons/tools/generate_report.py b/comparisons/tools/generate_report.py index ae60629..8a918a3 100644 --- a/comparisons/tools/generate_report.py +++ b/comparisons/tools/generate_report.py @@ -137,6 +137,13 @@ def requested_ratio(benchmark: str, input_: str, element_size: str, left: str, r return (float(alloc[benchmark, input_, element_size, left]["live_requested"]) / float(alloc[benchmark, input_, element_size, right]["live_requested"])) + largest_jack_gaps = sorted( + ((row["median_ns"] / cpu[row["benchmark"], "Vec"]["median_ns"], row["benchmark"]) + for row in report["cpu"] if row["implementation"] == "JackVec"), + reverse=True, + )[:3] + gap_summary = ", ".join(f"`{benchmark}` ({ratio:.3f}×)" for ratio, benchmark in largest_jack_gaps) + output.write_text(f"""# Latest benchmark comparison This is the authoritative `{report['platform_id']}` baseline. Lower ratios are @@ -162,11 +169,9 @@ def requested_ratio(benchmark: str, input_: str, element_size: str, left: str, r {cpu_ratio('append_preallocated/1024', 'JackVec', 'Vec'):.3f}× Vec and {cpu_ratio('append_preallocated/1024', 'JackVec', 'ThinVec'):.3f}× upstream ThinVec. This is a large targeted improvement, not a universal CPU claim. -- The clearest JackVec CPU losses versus Vec include 1,024-element sequential - iteration ({cpu_ratio('sequential_iteration/1024', 'JackVec', 'Vec'):.3f}×), - `u64` retain ({cpu_ratio('retain_mixed/u64', 'JackVec', 'Vec'):.3f}×), and - four-element append ({cpu_ratio('append_preallocated/4', 'JackVec', 'Vec'):.3f}×). - They are retained here as investigation targets. +- JackVec's three largest median CPU gaps versus Vec are {gap_summary}. They are + retained here as investigation targets; confidence-aware classifications remain + authoritative over point-estimate ordering. - Against the inline candidates, JackVec wins most measured CPU medians, while SmallVec avoids heap allocation when values fit inline. Neither representation dominates every workload. @@ -210,6 +215,9 @@ def requested_ratio(benchmark: str, input_: str, element_size: str, left: str, r - Commit: `{metadata['git_commit']}` - Compiler: `{metadata['compiler_identity']['release']}` (`{metadata['compiler_identity']['commit_hash']}`) +- Allocator policy: `{metadata['allocator']['policy']}`; inherited injection: + `{metadata['allocator']['inherited_environment']}`; effective injection: + `{metadata['allocator']['effective_environment']}` - CPU rounds: {report['round_count']}; CPU rows: {len(report['cpu'])}; allocation rows: {len(report['allocations'])} - Minimum pinned-core idle audit: {min(a['cpu_idle_percent'] for a in audits):.1f}% - Maximum audited one-minute load: {max(a['load_average'][0] for a in audits):.2f} diff --git a/comparisons/tools/run_matrix.py b/comparisons/tools/run_matrix.py index ae98264..6117a21 100644 --- a/comparisons/tools/run_matrix.py +++ b/comparisons/tools/run_matrix.py @@ -25,6 +25,7 @@ ROOT = Path(__file__).resolve().parents[2] RESULTS = ROOT / "comparisons" / "benchmark-results" CRITERION = ROOT / "target" / "criterion" +ALLOCATOR_ENVIRONMENT = ("LD_PRELOAD", "DYLD_INSERT_LIBRARIES") def command(args: list[str], *, capture: bool = True, check: bool = True, env: dict[str, str] | None = None) -> str: @@ -44,6 +45,15 @@ def git_dirty() -> bool: return bool(command(["git", "status", "--porcelain"])) +def configure_allocator(policy: str) -> dict[str, Any]: + inherited = {name: os.environ.get(name) for name in ALLOCATOR_ENVIRONMENT} + if policy == "system": + for name in ALLOCATOR_ENVIRONMENT: + os.environ.pop(name, None) + effective = {name: os.environ.get(name) for name in ALLOCATOR_ENVIRONMENT} + return {"policy": policy, "inherited_environment": inherited, "effective_environment": effective} + + def host_metadata(cpu: int | None) -> dict[str, Any]: def optional(args: list[str]) -> str: try: @@ -184,6 +194,9 @@ def pair_issues(left: dict[str, Any], right: dict[str, Any]) -> list[str]: for side, document in (("left", left), ("right", right)): if not document.get("metadata", {}).get("authoritative"): issues.append(f"{side} report is not authoritative") + allocator = document.get("metadata", {}).get("allocator") + if not allocator or allocator.get("policy") != "system": + issues.append(f"{side} report does not use an explicit system allocator policy") if left.get("metadata", {}).get("git_commit") != right.get("metadata", {}).get("git_commit"): issues.append("git commits differ") identity_fields = ("release", "commit_hash", "LLVM_version") @@ -296,9 +309,11 @@ def markdown_report(document: dict[str, Any]) -> str: lines = [ f"# JackVec comparison: {document['platform_id']}", "", - f"Commit: `{metadata['git_commit']}` ", - f"Rust: `{metadata['rustc'].splitlines()[0]}` ", - f"Platform: `{metadata['platform']}` ", + f"- Commit: `{metadata['git_commit']}`", + f"- Rust: `{metadata['rustc'].splitlines()[0]}`", + f"- Platform: `{metadata['platform']}`", + f"- Allocator policy: `{metadata['allocator']['policy']}`; effective override environment: " + f"`{metadata['allocator']['effective_environment']}`", f"Rounds: {document['round_count']}; practical-equivalence band: 0.97–1.03× Vec.", "", "A win or loss requires the complete paired bootstrap interval to clear the practical-equivalence band. Results that cross a boundary are reported as inconclusive.", @@ -337,6 +352,7 @@ def markdown_report(document: dict[str, Any]) -> str: def run(args: argparse.Namespace) -> None: os.environ["RUSTUP_TOOLCHAIN"] = args.toolchain + allocator = configure_allocator(args.allocator) dirty = git_dirty() if dirty and not args.allow_dirty: raise SystemExit("refusing an authoritative run from a dirty worktree; use --allow-dirty for exploratory data") @@ -346,6 +362,7 @@ def run(args: argparse.Namespace) -> None: os.sched_setaffinity(0, {args.cpu}) metadata = host_metadata(args.cpu) + metadata["allocator"] = allocator identity = compiler_identity(metadata["rustc"]) metadata["compiler_identity"] = identity if identity.get("release") != args.toolchain: @@ -427,6 +444,12 @@ def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--rounds", type=int, default=5) parser.add_argument("--toolchain", required=True, help="exact rustup toolchain, for example 1.97.0") + parser.add_argument( + "--allocator", + required=True, + choices=("system", "environment"), + help="system clears allocator injection variables; environment records but preserves them", + ) parser.add_argument("--cpu", type=int) parser.add_argument("--output-name") parser.add_argument("--allow-dirty", action="store_true") diff --git a/comparisons/tools/test_run_matrix.py b/comparisons/tools/test_run_matrix.py index 08c8de5..32aa1b9 100644 --- a/comparisons/tools/test_run_matrix.py +++ b/comparisons/tools/test_run_matrix.py @@ -1,5 +1,6 @@ import importlib.util import json +import os import tempfile import unittest from pathlib import Path @@ -12,6 +13,20 @@ class ReportingTests(unittest.TestCase): + def test_system_allocator_policy_clears_and_records_injection(self): + old = os.environ.get("LD_PRELOAD") + try: + os.environ["LD_PRELOAD"] = "/tmp/liballocator.so" + metadata = run_matrix.configure_allocator("system") + self.assertEqual(metadata["inherited_environment"]["LD_PRELOAD"], "/tmp/liballocator.so") + self.assertIsNone(metadata["effective_environment"]["LD_PRELOAD"]) + self.assertNotIn("LD_PRELOAD", os.environ) + finally: + if old is None: + os.environ.pop("LD_PRELOAD", None) + else: + os.environ["LD_PRELOAD"] = old + def test_classification_boundaries(self): self.assertEqual(run_matrix.classify(0.90, 0.96), "win") self.assertEqual(run_matrix.classify(1.04, 1.10), "loss") @@ -70,6 +85,11 @@ def test_pair_validation_rejects_compiler_and_matrix_differences(self): "authoritative": True, "git_commit": "abc", "compiler_identity": {"release": "1.97.0", "commit_hash": "hash", "LLVM_version": "22"}, + "allocator": { + "policy": "system", + "inherited_environment": {"LD_PRELOAD": None, "DYLD_INSERT_LIBRARIES": None}, + "effective_environment": {"LD_PRELOAD": None, "DYLD_INSERT_LIBRARIES": None}, + }, }, "cpu": [{"benchmark": "build/4", "implementation": "Vec"}], "allocations": [{"benchmark": "build", "input": "4", "element_size": "8", "implementation": "Vec"}],