Fibre MPMC benchmarks
many producers, many consumers, work-sharing
Throughput in Melem/s: Million items per second per item sent, median of samples. The best result in each row is highlighted. In batched tables, the bracketed figure is the gain over the same implementation's single-item row. A dash means the implementation has no channel for that cell. Measured on MacBook M4 Pro (14 cores).
sync
| Capacity | P×C | fibre | crossbeam | crossfire | flume | kanal |
|---|---|---|---|---|---|---|
| rendezvous | 1x1 | 0.565 | 0.539 | - | 0.448 | 6.33 |
| rendezvous | 1x16 | 0.615 | 0.168 | - | 0.504 | 1.23 |
| rendezvous | 1x64 | 0.526 | 0.155 | - | 0.462 | 0.463 |
| rendezvous | 16x1 | 0.519 | 0.165 | - | 0.196 | 1.42 |
| rendezvous | 16x16 | 0.545 | 0.286 | - | 0.330 | 1.43 |
| rendezvous | 64x1 | 0.635 | 0.167 | - | 0.209 | 0.474 |
| rendezvous | 64x64 | 0.558 | 0.274 | - | 0.339 | 1.54 |
| 1 | 1x1 | 1.69 | 7.03 | 13.0 | 0.649 | 4.28 |
| 1 | 1x16 | 0.174 | 0.189 | 2.13 | 0.520 | 1.87 |
| 1 | 1x64 | 0.174 | 0.160 | 0.721 | 0.558 | 0.461 |
| 1 | 16x1 | 0.179 | 0.198 | 3.70 | 0.216 | 1.58 |
| 1 | 16x16 | 0.125 | 1.78 | 3.37 | 0.354 | 1.12 |
| 1 | 64x1 | 0.172 | 0.163 | 1.27 | 0.215 | 0.569 |
| 1 | 64x64 | 0.106 | 1.65 | 4.76 | 0.319 | 1.46 |
| 128 | 1x1 | 39.7 | 35.7 | 110.2 | 26.4 | 16.4 |
| 128 | 1x16 | 9.91 | 10.4 | 14.7 | 0.530 | 5.58 |
| 128 | 1x64 | 5.58 | 0.624 | 8.20 | 0.572 | 0.504 |
| 128 | 16x1 | 8.88 | 14.9 | 14.3 | 0.210 | 1.53 |
| 128 | 16x16 | 18.8 | 21.4 | 21.8 | 3.62 | 2.87 |
| 128 | 64x1 | 5.92 | 0.198 | 9.31 | 0.219 | 0.436 |
| 128 | 64x64 | 16.9 | 8.48 | 18.7 | 2.29 | 3.71 |
| 1024 | 1x1 | 52.9 | 63.0 | 238.0 | 6.50 | 40.1 |
| 1024 | 1x16 | 27.5 | 12.9 | 69.1 | 0.545 | 4.44 |
| 1024 | 1x64 | 20.4 | 12.8 | 31.2 | 0.521 | 0.492 |
| 1024 | 16x1 | 24.2 | 17.5 | 31.9 | 0.243 | 1.43 |
| 1024 | 16x16 | 43.9 | 43.1 | 66.7 | 10.9 | 3.17 |
| 1024 | 64x1 | 19.0 | 5.96 | 25.6 | 0.233 | 0.502 |
| 1024 | 64x64 | 36.0 | 16.1 | 49.4 | 7.37 | 4.24 |
| unbounded | 1x1 | 134.4 | 143.7 | 126.9 | 9.47 | 137.7 |
| unbounded | 1x16 | 0.500 | 36.9 | 43.3 | 0.539 | 20.7 |
| unbounded | 1x64 | 0.445 | 18.0 | 38.4 | 0.536 | 0.411 |
| unbounded | 16x1 | 12.0 | 23.3 | 22.7 | 43.2 | 13.6 |
| unbounded | 16x16 | 9.76 | 50.7 | 44.0 | 18.2 | 3.88 |
| unbounded | 64x1 | 13.3 | 26.1 | 34.8 | 43.3 | 7.98 |
| unbounded | 64x64 | 9.36 | 46.6 | 44.5 | 15.3 | 3.68 |
Unreliable, sample spread over 2x on a 1×1 cell where the rest of the matrix holds within a few percent: fibre at capacity unbounded (2.8x, 48.4 to 137.5), flume at capacity unbounded (2.3x, 6.41 to 15.0). Those medians do not support a comparison.
sync, batched (512 items per call)
| Capacity | P×C | fibre | flume |
|---|---|---|---|
| 128 | 1x1 | 135.2 (3.4x) | 20.2 (0.8x) |
| 128 | 1x16 | 12.1 (1.2x) | 0.474 (0.9x) |
| 128 | 1x64 | 12.1 (2.2x) | 0.501 (0.9x) |
| 128 | 16x1 | 15.6 (1.8x) | 3.55 (16.9x) |
| 128 | 16x16 | 29.5 (1.6x) | 4.83 (1.3x) |
| 128 | 64x1 | 8.65 (1.5x) | 1.39 (6.3x) |
| 128 | 64x64 | 25.1 (1.5x) | 3.59 (1.6x) |
| 1024 | 1x1 | 216.5 (4.1x) | 72.4 (11.1x) |
| 1024 | 1x16 | 63.6 (2.3x) | 0.500 (0.9x) |
| 1024 | 1x64 | 38.7 (1.9x) | 0.487 (0.9x) |
| 1024 | 16x1 | 65.1 (2.7x) | 18.0 (74.1x) |
| 1024 | 16x16 | 117.5 (2.7x) | 11.7 (1.1x) |
| 1024 | 64x1 | 39.3 (2.1x) | 6.34 (27.2x) |
| 1024 | 64x64 | 92.3 (2.6x) | 8.34 (1.1x) |
| unbounded | 1x1 | 225.6 (1.7x) | 106.8 (11.3x) |
| unbounded | 1x16 | 101.4 (202.8x) | 0.474 (0.9x) |
| unbounded | 1x64 | 91.1 (204.7x) | 0.478 (0.9x) |
| unbounded | 16x1 | 203.2 (16.9x) | 49.4 (1.1x) |
| unbounded | 16x16 | 157.3 (16.1x) | 12.8 (0.7x) |
| unbounded | 64x1 | 202.2 (15.2x) | 57.3 (1.3x) |
| unbounded | 64x64 | 151.2 (16.1x) | 14.1 (0.9x) |
Native batch: fibre none, flume receive only.
async
| Capacity | P×C | fibre | async-channel | crossfire | flume | kanal |
|---|---|---|---|---|---|---|
| rendezvous | 1x1 | 25.4 | - | - | 7.11 | 21.3 |
| rendezvous | 1x16 | 7.05 | - | - | 1.45 | 6.24 |
| rendezvous | 1x64 | 3.95 | - | - | 0.461 | 0.981 |
| rendezvous | 16x1 | 6.63 | - | - | 0.929 | 6.14 |
| rendezvous | 16x16 | 5.36 | - | - | 3.05 | 9.45 |
| rendezvous | 64x1 | 4.12 | - | - | 0.586 | 0.978 |
| rendezvous | 64x64 | 4.77 | - | - | 2.85 | 13.1 |
| 1 | 1x1 | 10.0 | 3.88 | 6.56 | 7.16 | 28.2 |
| 1 | 1x16 | 7.80 | 1.71 | 0.682 | 1.50 | 9.80 |
| 1 | 1x64 | 6.84 | 1.76 | 0.576 | 0.472 | 0.972 |
| 1 | 16x1 | 7.86 | 1.75 | 0.682 | 0.899 | 16.6 |
| 1 | 16x16 | 6.85 | 0.554 | 1.12 | 2.65 | 13.9 |
| 1 | 64x1 | 6.59 | 1.73 | 0.566 | 0.600 | 10.8 |
| 1 | 64x64 | 5.10 | 0.446 | 1.05 | 2.92 | 11.6 |
| 128 | 1x1 | 57.0 | 24.2 | 72.3 | 38.1 | 76.3 |
| 128 | 1x16 | 20.3 | 3.49 | 13.1 | 5.26 | 14.2 |
| 128 | 1x64 | 10.3 | 1.06 | 9.43 | 0.981 | 2.08 |
| 128 | 16x1 | 18.5 | 3.52 | 14.7 | 3.52 | 22.3 |
| 128 | 16x16 | 23.7 | 7.15 | 8.59 | 13.1 | 45.8 |
| 128 | 64x1 | 7.11 | 1.24 | 9.38 | 0.983 | 30.6 |
| 128 | 64x64 | 21.3 | 7.01 | 7.08 | 13.1 | 9.65 |
| 1024 | 1x1 | 58.8 | 21.2 | 85.1 | 23.6 | 81.2 |
| 1024 | 1x16 | 21.7 | 7.48 | 16.3 | 6.89 | 6.44 |
| 1024 | 1x64 | 15.0 | 2.28 | 14.2 | 1.67 | 2.93 |
| 1024 | 16x1 | 20.4 | 7.39 | 17.7 | 5.12 | 3.64 |
| 1024 | 16x16 | 30.2 | 9.51 | 14.7 | 16.3 | 7.66 |
| 1024 | 64x1 | 10.4 | 3.95 | 15.6 | 1.43 | 9.16 |
| 1024 | 64x64 | 25.7 | 9.65 | 15.8 | 16.1 | 20.8 |
| unbounded | 1x1 | 74.6 | 28.9 | 101.2 | 50.2 | 100.5 |
| unbounded | 1x16 | 29.0 | 17.1 | 29.2 | 7.41 | 6.58 |
| unbounded | 1x64 | 23.6 | 11.7 | 29.6 | 1.65 | 4.31 |
| unbounded | 16x1 | 13.0 | 10.3 | 41.2 | 28.2 | 19.3 |
| unbounded | 16x16 | 9.44 | 8.33 | 31.1 | 15.0 | 7.96 |
| unbounded | 64x1 | 11.9 | 9.87 | 20.4 | 25.7 | 23.3 |
| unbounded | 64x64 | 8.44 | 9.04 | 29.6 | 16.4 | 10.4 |
Unreliable, sample spread over 2x on a 1×1 cell where the rest of the matrix holds within a few percent: crossfire at capacity 1 (3.3x, 2.33 to 7.66). Those medians do not support a comparison.
async, batched (512 items per call)
| Capacity | P×C | fibre | flume |
|---|---|---|---|
| 128 | 1x1 | 155.4 (2.7x) | 54.6 (1.4x) |
| 128 | 1x16 | 76.3 (3.8x) | 5.44 (1.0x) |
| 128 | 1x64 | 29.0 (2.8x) | 0.744 (0.8x) |
| 128 | 16x1 | 58.5 (3.2x) | 7.40 (2.1x) |
| 128 | 16x16 | 74.8 (3.2x) | 16.6 (1.3x) |
| 128 | 64x1 | 21.5 (3.0x) | 4.58 (4.7x) |
| 128 | 64x64 | 72.0 (3.4x) | 16.1 (1.2x) |
| 1024 | 1x1 | 213.5 (3.6x) | 57.1 (2.4x) |
| 1024 | 1x16 | 130.8 (6.0x) | 7.78 (1.1x) |
| 1024 | 1x64 | 88.1 (5.9x) | 1.02 (0.6x) |
| 1024 | 16x1 | 115.1 (5.6x) | 18.1 (3.5x) |
| 1024 | 16x16 | 168.2 (5.6x) | 26.2 (1.6x) |
| 1024 | 64x1 | 70.4 (6.8x) | 15.4 (10.7x) |
| 1024 | 64x64 | 164.8 (6.4x) | 24.9 (1.5x) |
| unbounded | 1x1 | 182.9 (2.5x) | 87.6 (1.7x) |
| unbounded | 1x16 | 91.3 (3.1x) | 7.95 (1.1x) |
| unbounded | 1x64 | 93.2 (3.9x) | 1.06 (0.6x) |
| unbounded | 16x1 | 201.7 (15.5x) | 39.1 (1.4x) |
| unbounded | 16x16 | 125.2 (13.3x) | 17.9 (1.2x) |
| unbounded | 64x1 | 203.1 (17.1x) | 38.3 (1.5x) |
| unbounded | 64x64 | 118.2 (14.0x) | 26.3 (1.6x) |
Native batch: fibre none, flume receive only.
