# Multitude Performance Report
Generated by `scripts/perf_report.rs`:
- `cargo bench --bench criterion_alloc` and `criterion_drop` — criterion wall-clock timings.
- `cargo bench --bench criterion_arena_vs_allocator` — criterion wall-clock timing of allocating a mixed working set and then releasing it, comparing the arena (bulk reset) against the system allocator (mimalloc, per-object free).
- `cargo bench --bench gungraun_alloc` and `gungraun_drop` — Callgrind instruction-precise counts.
**Workload:** N = 1000 operations per measurement; slice element count = 8.
Criterion median is reported (default 30 samples, 1 s warm-up, 2 s measurement; override with `--samples` / `--measurement-time` / `--warm-up-time`).
Memory accesses = L1 Hits + LL Hits + RAM Hits (Callgrind D-cache references).
Bench names are aligned between criterion and gungraun via the `GROUPS` table in `scripts/perf_report.rs`.
## `arena_creation`
| `multitude_new` | 36 ns | 299 | 8 | 427 |
| `bumpalo_new` | 1 ns | 16 | 1 | 26 |
## `alloc_u64`
| `alloc` | 5.29 µs | 15,020 | 11 | 23,034 |
| `alloc_with` | 4.57 µs | 15,020 | 12 | 23,034 |
| `alloc_box` | 4.93 µs | 23,039 | 9 | 37,070 |
| `alloc_box_with` | 5.01 µs | 24,039 | 9 | 38,070 |
| `alloc_uninit_box` | 2.50 µs | 20,039 | 9 | 31,070 |
| `alloc_zeroed_box` | 4.67 µs | 21,039 | 9 | 33,070 |
| `alloc_arc` | 9.34 µs | 25,039 | 9 | 40,070 |
| `alloc_arc_with` | 9.40 µs | 26,039 | 8 | 41,070 |
| `alloc_uninit_arc` | 8.75 µs | 22,039 | 8 | 34,070 |
| `alloc_zeroed_arc` | 9.07 µs | 23,039 | 9 | 36,070 |
| `alloc_rc` | 9.34 µs | 25,039 | 9 | 40,070 |
| `alloc_rc_with` | 9.34 µs | 26,039 | 9 | 41,070 |
| `alloc_uninit_rc` | 8.79 µs | 22,039 | 9 | 34,070 |
| `alloc_zeroed_rc` | 9.07 µs | 23,039 | 9 | 36,070 |
| `bumpalo_alloc` | 3.94 µs | 19,022 | 4 | 27,037 |
| `bumpalo_alloc_with` | 4.13 µs | 19,020 | 4 | 27,034 |
## `alloc_str`
| `alloc_str` | 6.97 µs | 52,049 | 11 | 78,090 |
| `alloc_str_box` | 12.19 µs | 59,049 | 12 | 85,090 |
| `alloc_str_arc` | 14.26 µs | 52,050 | 4 | 76,090 |
| `alloc_str_rc` | 14.10 µs | 50,050 | 3 | 74,090 |
| `bumpalo_alloc_str` | 7.04 µs | 50,048 | 13 | 75,088 |
## `alloc_slice`
| `alloc_slice_copy` | 42.62 µs | 42,045 | 3 | 59,082 |
| `alloc_slice_clone` | 41.75 µs | 46,046 | 10 | 60,083 |
| `alloc_slice_fill_with` | 45.34 µs | 39,024 | 10 | 70,039 |
| `alloc_slice_fill_iter` | 45.17 µs | 39,025 | 12 | 70,040 |
| `alloc_slice_copy_box` | 52.19 µs | 55,170 | 19 | 83,267 |
| `alloc_slice_clone_box` | 50.94 µs | 68,170 | 26 | 92,266 |
| `alloc_slice_fill_with_box` | 54.23 µs | 48,153 | 23 | 86,235 |
| `alloc_slice_fill_iter_box` | 54.98 µs | 50,153 | 19 | 90,235 |
| `alloc_uninit_slice_box` | 49.76 µs | 23,153 | 22 | 36,235 |
| `alloc_zeroed_slice_box` | 50.12 µs | 27,153 | 23 | 43,235 |
| `alloc_slice_copy_arc` | 56.79 µs | 50,203 | 15 | 74,312 |
| `alloc_slice_clone_arc` | 55.92 µs | 56,253 | 28 | 77,380 |
| `alloc_slice_fill_with_arc` | 58.66 µs | 46,015 | 15 | 83,019 |
| `alloc_slice_fill_iter_arc` | 59.14 µs | 46,015 | 15 | 83,019 |
| `alloc_uninit_slice_arc` | 53.71 µs | 22,174 | 25 | 35,265 |
| `alloc_zeroed_slice_arc` | 54.50 µs | 25,168 | 25 | 40,256 |
| `alloc_slice_copy_rc` | 56.62 µs | 50,203 | 18 | 74,312 |
| `alloc_slice_clone_rc` | 55.10 µs | 56,253 | 26 | 77,380 |
| `alloc_slice_fill_with_rc` | 57.75 µs | 46,015 | 16 | 83,019 |
| `alloc_slice_fill_iter_rc` | 58.77 µs | 46,015 | 15 | 83,019 |
| `alloc_uninit_slice_rc` | 53.73 µs | 22,174 | 24 | 35,265 |
| `alloc_zeroed_slice_rc` | 54.67 µs | 25,168 | 25 | 40,256 |
| `bumpalo_alloc_slice_copy` | 38.68 µs | 38,042 | 5 | 55,076 |
| `bumpalo_alloc_slice_clone` | 37.53 µs | 60,046 | 10 | 74,083 |
| `bumpalo_alloc_slice_fill_with` | 40.50 µs | 40,020 | 5 | 70,033 |
| `bumpalo_alloc_slice_fill_iter` | 42.89 µs | 40,020 | 4 | 70,033 |
## `string_builder`
| `alloc_string` | 6.44 µs | 36,855 | 34 | 51,209 |
| `alloc_string_with_capacity` | 6.46 µs | 37,222 | 19 | 52,343 |
| `bumpalo_string_new_in` | 10.07 µs | 35,843 | 79 | 50,867 |
| `bumpalo_string_with_capacity_in` | 9.49 µs | 34,708 | 27 | 49,159 |
## `vec_builder`
| `alloc_vec` | 1.03 µs | 11,814 | 28 | 17,109 |
| `alloc_vec_with_capacity` | 1.11 µs | 12,149 | 11 | 18,235 |
| `bumpalo_vec_new_in` | 3.91 µs | 12,281 | 61 | 18,888 |
| `bumpalo_vec_with_capacity_in` | 3.71 µs | 11,069 | 7 | 17,116 |
## `arena_vs_allocator`
| `arena` | 10.73 µs | — | — | — |
| `system` | 34.82 µs | — | — | — |
## `drop`
| `box_u64` | 4.38 µs | 9,560 | 29 | 12,826 |
| `rc_u64` | 5.59 µs | 12,554 | 28 | 16,817 |
| `arc_u64` | 8.25 µs | 11,554 | 28 | 16,817 |
| `box_droppy` | 18.11 µs | 185,290 | 58 | 271,252 |
| `rc_droppy` | 18.97 µs | 188,289 | 58 | 275,251 |
| `arc_droppy` | 19.61 µs | 187,289 | 64 | 275,251 |
| `str_box` | 4.63 µs | 9,560 | 29 | 12,826 |
| `str_rc` | 5.55 µs | 12,554 | 25 | 16,817 |
| `str_arc` | 8.11 µs | 11,554 | 28 | 16,817 |
| `slice_box_u64` | 10.15 µs | 9,736 | 45 | 13,067 |
| `slice_rc_u64` | 12.22 µs | 12,730 | 42 | 17,058 |
| `slice_arc_u64` | 14.52 µs | 11,730 | 43 | 17,058 |
| `slice_box_droppy` | 115.72 µs | 1,511,455 | 1,105 | 2,203,111 |
| `slice_rc_droppy` | 115.63 µs | 1,514,454 | 1,112 | 2,207,109 |
| `slice_arc_droppy` | 115.27 µs | 1,514,454 | 1,100 | 2,208,109 |
| `alloc` | 1.44 µs | 371 | 16 | 541 |
## Multitude vs Bumpalo Head-to-Head
Direct comparisons of multitude versus bumpalo on identical workloads (the multitude variant chosen is the closest semantic equivalent to bumpalo's plain bump-allocation).
| `alloc` vs `bumpalo_alloc` | 5.29 µs | 3.94 µs | +34.5% | 15,020 | 19,022 | -21.0% |
| `alloc_str` vs `bumpalo_alloc_str` | 6.97 µs | 7.04 µs | -1.0% | 52,049 | 50,048 | +4.0% |
| `alloc_slice_copy` vs `bumpalo_alloc_slice_copy` | 42.62 µs | 38.68 µs | +10.2% | 42,045 | 38,042 | +10.5% |
| `alloc_slice_clone` vs `bumpalo_alloc_slice_clone` | 41.75 µs | 37.53 µs | +11.3% | 46,046 | 60,046 | -23.3% |
| `alloc_slice_fill_with` vs `bumpalo_alloc_slice_fill_with` | 45.34 µs | 40.50 µs | +11.9% | 39,024 | 40,020 | -2.5% |
| `alloc_slice_fill_iter` vs `bumpalo_alloc_slice_fill_iter` | 45.17 µs | 42.89 µs | +5.3% | 39,025 | 40,020 | -2.5% |
| `alloc_string` vs `bumpalo_string_new_in` | 6.44 µs | 10.07 µs | -36.0% | 36,855 | 35,843 | +2.8% |
| `alloc_string_with_capacity` vs `bumpalo_string_with_capacity_in` | 6.46 µs | 9.49 µs | -31.9% | 37,222 | 34,708 | +7.2% |
| `alloc_vec` vs `bumpalo_vec_new_in` | 1.03 µs | 3.91 µs | -73.6% | 11,814 | 12,281 | -3.8% |
| `alloc_vec_with_capacity` vs `bumpalo_vec_with_capacity_in` | 1.11 µs | 3.71 µs | -70.2% | 12,149 | 11,069 | +9.8% |