Criterion median timings, side-by-side. Ratio = libzmq / rustzmq2 — higher is better for rustzmq2. Click a pattern name to open the full criterion report for that group.
Per-sub columns (pub_sub, xpub_sub): median / p99 latency from publish to each subscriber receiving the message. Criterion’s headline number is the barrier time (time until the slowest subscriber finishes) — informative as a tail metric but dominated by stragglers. Median-per-sub is the typical-case latency a real application would observe.
| Pattern | Transport | Size | rustzmq2 barrier | libzmq barrier | rustzmq2 p50/p99 | libzmq p50/p99 | Ratio |
|---|---|---|---|---|---|---|---|
| pair | tcp | 16 B | 46.14 µs | 58.29 µs | — | — | 1.26× |
| pair | tcp | 256 B | 46.59 µs | 59.15 µs | — | — | 1.27× |
| pair | tcp | 4 KB | 50.63 µs | 62.09 µs | — | — | 1.23× |
| pair | tcp | 64 KB | 84.80 µs | 102.46 µs | — | — | 1.21× |
| pair | ipc | 16 B | 39.31 µs | 48.82 µs | — | — | 1.24× |
| pair | ipc | 256 B | 39.32 µs | 50.18 µs | — | — | 1.28× |
| pair | ipc | 4 KB | 42.95 µs | 53.48 µs | — | — | 1.25× |
| pair | ipc | 64 KB | 61.76 µs | 81.61 µs | — | — | 1.32× |
| pair | inproc | 16 B | 1.11 µs | 21.48 µs | — | — | 19.31× |
| pair | inproc | 256 B | 1.12 µs | 21.86 µs | — | — | 19.54× |
| pair | inproc | 4 KB | 1.31 µs | 23.13 µs | — | — | 17.63× |
| pair | inproc | 64 KB | 3.48 µs | 30.43 µs | — | — | 8.74× |
| pub_sub (subs=64) | tcp | 16 B | 464.22 µs | 967.56 µs | 381.52 µs / 991.91 µs | 634.42 µs / 958.34 µs | 1.66× |
| pub_sub (subs=1) | tcp | 16 B | 40.41 µs | 37.58 µs | 40.55 µs / 50.14 µs | 32.08 µs / 40.62 µs | 0.79× (1.26× slower) |
| pub_sub (subs=8) | tcp | 16 B | 67.00 µs | 127.30 µs | 62.00 µs / 90.90 µs | 91.39 µs / 141.03 µs | 1.47× |
| pub_sub (subs=64) | tcp | 256 B | 467.67 µs | 992.42 µs | 394.58 µs / 993.79 µs | 684.00 µs / 967.86 µs | 1.73× |
| pub_sub (subs=1) | tcp | 256 B | 39.80 µs | 37.97 µs | 40.20 µs / 49.62 µs | 33.66 µs / 46.06 µs | 0.84× (1.19× slower) |
| pub_sub (subs=8) | tcp | 256 B | 67.55 µs | 129.88 µs | 61.50 µs / 89.70 µs | 94.07 µs / 145.52 µs | 1.53× |
| pub_sub (subs=64) | tcp | 4 KB | 527.32 µs | 1.05 ms | 443.44 µs / 933.43 µs | 707.04 µs / 958.66 µs | 1.59× |
| pub_sub (subs=1) | tcp | 4 KB | 42.33 µs | 39.65 µs | 41.62 µs / 48.40 µs | 35.30 µs / 45.65 µs | 0.85× (1.18× slower) |
| pub_sub (subs=8) | tcp | 4 KB | 73.91 µs | 143.31 µs | 69.13 µs / 94.99 µs | 103.68 µs / 162.93 µs | 1.50× |
| pub_sub (subs=64) | tcp | 64 KB | 961.24 µs | 2.71 ms | 841.54 µs / 1.49 ms | 1.51 ms / 2.59 ms | 1.79× |
| pub_sub (subs=1) | tcp | 64 KB | 55.16 µs | 67.07 µs | 52.59 µs / 66.51 µs | 59.19 µs / 94.26 µs | 1.13× |
| pub_sub (subs=8) | tcp | 64 KB | 148.71 µs | 306.02 µs | 143.72 µs / 239.42 µs | 263.28 µs / 329.06 µs | 1.83× |
| pub_sub (subs=64) | ipc | 16 B | 326.25 µs | 796.90 µs | 327.14 µs / 408.64 µs | 481.20 µs / 723.21 µs | 1.47× |
| pub_sub (subs=8) | ipc | 16 B | 49.30 µs | 94.39 µs | 44.20 µs / 60.21 µs | 60.71 µs / 92.28 µs | 1.37× |
| pub_sub (subs=1) | ipc | 16 B | 26.31 µs | 30.82 µs | 26.06 µs / 32.12 µs | 26.61 µs / 30.47 µs | 1.02× |
| pub_sub (subs=64) | ipc | 256 B | 337.41 µs | 809.60 µs | 339.93 µs / 431.16 µs | 488.65 µs / 693.26 µs | 1.44× |
| pub_sub (subs=8) | ipc | 256 B | 49.84 µs | 96.06 µs | 44.95 µs / 62.41 µs | 63.15 µs / 93.55 µs | 1.40× |
| pub_sub (subs=1) | ipc | 256 B | 26.13 µs | 31.23 µs | 25.78 µs / 32.40 µs | 27.21 µs / 31.95 µs | 1.06× |
| pub_sub (subs=64) | ipc | 4 KB | 421.88 µs | 882.30 µs | 358.97 µs / 573.53 µs | 569.80 µs / 749.00 µs | 1.59× |
| pub_sub (subs=8) | ipc | 4 KB | 58.73 µs | 109.01 µs | 52.95 µs / 75.22 µs | 75.23 µs / 108.36 µs | 1.42× |
| pub_sub (subs=1) | ipc | 4 KB | 29.61 µs | 33.07 µs | 28.97 µs / 35.95 µs | 29.02 µs / 33.87 µs | 1.00× |
| pub_sub (subs=64) | ipc | 64 KB | 938.97 µs | 2.39 ms | 767.52 µs / 1.44 ms | 1.27 ms / 2.05 ms | 1.66× |
| pub_sub (subs=8) | ipc | 64 KB | 125.54 µs | 249.76 µs | 118.52 µs / 198.73 µs | 206.72 µs / 256.51 µs | 1.74× |
| pub_sub (subs=1) | ipc | 64 KB | 46.76 µs | 47.48 µs | 45.70 µs / 55.35 µs | 42.15 µs / 61.80 µs | 0.92× (1.08× slower) |
| pub_sub (subs=1) | inproc | 16 B | 682 ns | 16.68 µs | 424 ns / 456 ns | 13.24 µs / 14.21 µs | 31.22× |
| pub_sub (subs=8) | inproc | 16 B | 2.65 µs | 49.44 µs | 1.70 µs / 2.46 µs | 30.12 µs / 49.32 µs | 17.67× |
| pub_sub (subs=64) | inproc | 16 B | 18.05 µs | 470.31 µs | 11.82 µs / 18.24 µs | 297.13 µs / 343.06 µs | 25.13× |
| pub_sub (subs=1) | inproc | 256 B | 689 ns | 16.98 µs | 432 ns / 472 ns | 13.35 µs / 14.44 µs | 30.91× |
| pub_sub (subs=8) | inproc | 256 B | 2.67 µs | 49.06 µs | 1.70 µs / 2.48 µs | 28.05 µs / 43.75 µs | 16.46× |
| pub_sub (subs=64) | inproc | 256 B | 17.93 µs | 464.16 µs | 11.63 µs / 17.88 µs | 287.87 µs / 331.79 µs | 24.76× |
| pub_sub (subs=1) | inproc | 4 KB | 765 ns | 17.17 µs | 512 ns / 552 ns | 13.75 µs / 14.82 µs | 26.86× |
| pub_sub (subs=8) | inproc | 4 KB | 2.82 µs | 52.13 µs | 1.88 µs / 2.69 µs | 30.54 µs / 50.73 µs | 16.25× |
| pub_sub (subs=64) | inproc | 4 KB | 18.17 µs | 479.21 µs | 11.84 µs / 18.35 µs | 298.41 µs / 342.72 µs | 25.20× |
| pub_sub (subs=1) | inproc | 64 KB | 1.74 µs | 19.27 µs | 1.46 µs / 1.52 µs | 15.77 µs / 18.76 µs | 10.83× |
| pub_sub (subs=8) | inproc | 64 KB | 3.82 µs | 66.22 µs | 2.81 µs / 3.58 µs | 44.76 µs / 67.96 µs | 15.94× |
| pub_sub (subs=64) | inproc | 64 KB | 19.41 µs | 591.22 µs | 12.95 µs / 20.34 µs | 417.45 µs / 476.91 µs | 32.23× |
| pub_xsub | tcp | 16 B | 43.60 µs | 28.71 µs | — | — | 0.66× (1.52× slower) |
| pub_xsub | tcp | 256 B | 43.81 µs | 29.94 µs | — | — | 0.68× (1.46× slower) |
| pub_xsub | tcp | 4 KB | 45.52 µs | 31.12 µs | — | — | 0.68× (1.46× slower) |
| pub_xsub | tcp | 64 KB | 59.68 µs | 49.84 µs | — | — | 0.84× (1.20× slower) |
| pub_xsub | ipc | 16 B | 28.02 µs | 18.87 µs | — | — | 0.67× (1.49× slower) |
| pub_xsub | ipc | 256 B | 27.39 µs | 24.53 µs | — | — | 0.90× (1.12× slower) |
| pub_xsub | ipc | 4 KB | 31.50 µs | 26.40 µs | — | — | 0.84× (1.19× slower) |
| pub_xsub | ipc | 64 KB | 48.82 µs | 39.71 µs | — | — | 0.81× (1.23× slower) |
| push_pull | tcp | 16 B | 39.49 µs | 28.24 µs | — | — | 0.72× (1.40× slower) |
| push_pull | tcp | 256 B | 40.03 µs | 28.97 µs | — | — | 0.72× (1.38× slower) |
| push_pull | tcp | 4 KB | 43.85 µs | 30.39 µs | — | — | 0.69× (1.44× slower) |
| push_pull | tcp | 64 KB | 54.38 µs | 48.18 µs | — | — | 0.89× (1.13× slower) |
| push_pull | ipc | 16 B | 24.84 µs | 22.63 µs | — | — | 0.91× (1.10× slower) |
| push_pull | ipc | 256 B | 25.14 µs | 23.26 µs | — | — | 0.93× (1.08× slower) |
| push_pull | ipc | 4 KB | 28.20 µs | 25.37 µs | — | — | 0.90× (1.11× slower) |
| push_pull | ipc | 64 KB | 42.60 µs | 38.61 µs | — | — | 0.91× (1.10× slower) |
| push_pull | inproc | 16 B | 623 ns | 155 ns | — | — | 0.25× (4.03× slower) |
| push_pull | inproc | 256 B | 630 ns | 171 ns | — | — | 0.27× (3.68× slower) |
| push_pull | inproc | 4 KB | 716 ns | 348 ns | — | — | 0.49× (2.06× slower) |
| push_pull | inproc | 64 KB | 1.81 µs | 2.52 µs | — | — | 1.39× |
| req_rep | tcp | 16 B | 51.51 µs | 58.69 µs | — | — | 1.14× |
| req_rep | tcp | 256 B | 51.96 µs | 60.41 µs | — | — | 1.16× |
| req_rep | tcp | 4 KB | 58.15 µs | 62.83 µs | — | — | 1.08× |
| req_rep | tcp | 64 KB | 97.43 µs | 102.05 µs | — | — | 1.05× |
| req_rep | ipc | 16 B | 43.12 µs | 48.10 µs | — | — | 1.12× |
| req_rep | ipc | 256 B | 43.06 µs | 49.83 µs | — | — | 1.16× |
| req_rep | ipc | 4 KB | 49.12 µs | 53.41 µs | — | — | 1.09× |
| req_rep | ipc | 64 KB | 68.30 µs | 82.25 µs | — | — | 1.20× |
| req_rep | inproc | 16 B | 945 ns | 20.36 µs | — | — | 21.55× |
| req_rep | inproc | 256 B | 960 ns | 21.02 µs | — | — | 21.90× |
| req_rep | inproc | 4 KB | 1.15 µs | 22.54 µs | — | — | 19.64× |
| req_rep | inproc | 64 KB | 3.33 µs | 30.65 µs | — | — | 9.22× |
| throughput/dealer_router | tcp | 256 B | 7.74 ms | 1.63 ms | — | — | 0.21× (4.75× slower) |
| throughput/dealer_router | tcp | 4 KB | 18.34 ms | 9.72 ms | — | — | 0.53× (1.89× slower) |
| throughput/dealer_router | ipc | 256 B | 4.59 ms | 1.64 ms | — | — | 0.36× (2.80× slower) |
| throughput/dealer_router | ipc | 4 KB | 8.03 ms | 6.71 ms | — | — | 0.84× (1.20× slower) |
| throughput/dealer_router | inproc | 256 B | 789.62 µs | 1.30 ms | — | — | 1.65× |
| throughput/dealer_router | inproc | 4 KB | 850.88 µs | 2.26 ms | — | — | 2.65× |
| throughput/pub_fanout (subs=8) | tcp | 256 B | 15.30 ms | 4.03 ms | — | — | 0.26× (3.80× slower) |
| throughput/pub_fanout (subs=64) | tcp | 256 B | 137.10 ms | 35.40 ms | — | — | 0.26× (3.87× slower) |
| throughput/pub_fanout (subs=1) | tcp | 256 B | 3.83 ms | 773.94 µs | — | — | 0.20× (4.95× slower) |
| throughput/pub_fanout (subs=8) | tcp | 4 KB | 128.36 ms | 42.86 ms | — | — | 0.33× (2.99× slower) |
| throughput/pub_fanout (subs=64) | tcp | 4 KB | 245.19 ms | 405.87 ms | — | — | 1.66× |
| throughput/pub_fanout (subs=1) | tcp | 4 KB | 4.58 ms | 4.60 ms | — | — | 1.00× |
| throughput/pub_fanout (subs=1) | ipc | 256 B | 2.19 ms | 595.18 µs | — | — | 0.27× (3.68× slower) |
| throughput/pub_fanout (subs=64) | ipc | 256 B | 69.62 ms | 27.41 ms | — | — | 0.39× (2.54× slower) |
| throughput/pub_fanout (subs=8) | ipc | 256 B | 9.29 ms | 3.13 ms | — | — | 0.34× (2.97× slower) |
| throughput/pub_fanout (subs=1) | ipc | 4 KB | 3.82 ms | 2.95 ms | — | — | 0.77× (1.30× slower) |
| throughput/pub_fanout (subs=64) | ipc | 4 KB | 147.65 ms | 281.39 ms | — | — | 1.91× |
| throughput/pub_fanout (subs=8) | ipc | 4 KB | 18.95 ms | 25.84 ms | — | — | 1.36× |
| xpub_sub (subs=64) | tcp | 16 B | 500.19 µs | 923.17 µs | 407.92 µs / 984.67 µs | 611.83 µs / 847.19 µs | 1.50× |
| xpub_sub (subs=1) | tcp | 16 B | 46.59 µs | 33.92 µs | 46.46 µs / 55.17 µs | 29.53 µs / 37.41 µs | 0.64× (1.57× slower) |
| xpub_sub (subs=8) | tcp | 16 B | 75.75 µs | 118.75 µs | 68.27 µs / 92.92 µs | 85.43 µs / 127.86 µs | 1.25× |
| xpub_sub (subs=64) | tcp | 256 B | 500.08 µs | 930.88 µs | 405.95 µs / 1.01 ms | 636.25 µs / 893.38 µs | 1.57× |
| xpub_sub (subs=1) | tcp | 256 B | 46.79 µs | 34.51 µs | 46.21 µs / 55.66 µs | 30.89 µs / 36.63 µs | 0.67× (1.50× slower) |
| xpub_sub (subs=8) | tcp | 256 B | 77.26 µs | 120.41 µs | 70.75 µs / 96.01 µs | 87.84 µs / 130.44 µs | 1.24× |
| xpub_sub (subs=64) | tcp | 4 KB | 555.52 µs | 976.74 µs | 455.31 µs / 1.08 ms | 679.78 µs / 894.30 µs | 1.49× |
| xpub_sub (subs=1) | tcp | 4 KB | 51.08 µs | 35.51 µs | 50.63 µs / 60.62 µs | 31.90 µs / 38.21 µs | 0.63× (1.59× slower) |
| xpub_sub (subs=8) | tcp | 4 KB | 87.03 µs | 134.69 µs | 80.44 µs / 111.59 µs | 100.36 µs / 149.73 µs | 1.25× |
| xpub_sub (subs=64) | tcp | 64 KB | 1.03 ms | 2.06 ms | 850.19 µs / 1.69 ms | 1.52 ms / 2.56 ms | 1.79× |
| xpub_sub (subs=1) | tcp | 64 KB | 63.00 µs | 57.02 µs | 61.69 µs / 82.99 µs | 52.12 µs / 81.52 µs | 0.84× (1.18× slower) |
| xpub_sub (subs=8) | tcp | 64 KB | 153.29 µs | 291.06 µs | 149.22 µs / 236.90 µs | 246.53 µs / 301.34 µs | 1.65× |
| xpub_sub (subs=1) | ipc | 16 B | 26.58 µs | 28.15 µs | 26.12 µs / 32.95 µs | 24.33 µs / 28.51 µs | 0.93× (1.07× slower) |
| xpub_sub (subs=8) | ipc | 16 B | 49.84 µs | 90.33 µs | 44.56 µs / 61.71 µs | 59.02 µs / 86.99 µs | 1.32× |
| xpub_sub (subs=64) | ipc | 16 B | 328.35 µs | 761.76 µs | 273.33 µs / 611.90 µs | 463.98 µs / 696.67 µs | 1.70× |
| xpub_sub (subs=1) | ipc | 256 B | 27.33 µs | 28.81 µs | 26.98 µs / 33.74 µs | 25.18 µs / 28.67 µs | 0.93× (1.07× slower) |
| xpub_sub (subs=8) | ipc | 256 B | 50.26 µs | 91.98 µs | 44.91 µs / 62.14 µs | 60.52 µs / 91.08 µs | 1.35× |
| xpub_sub (subs=64) | ipc | 256 B | 326.98 µs | 769.52 µs | 269.62 µs / 578.53 µs | 468.91 µs / 680.57 µs | 1.74× |
| xpub_sub (subs=1) | ipc | 4 KB | 31.16 µs | 30.32 µs | 30.18 µs / 38.98 µs | 26.38 µs / 30.95 µs | 0.87× (1.14× slower) |
| xpub_sub (subs=8) | ipc | 4 KB | 59.05 µs | 103.93 µs | 53.26 µs / 74.11 µs | 70.44 µs / 102.31 µs | 1.32× |
| xpub_sub (subs=64) | ipc | 4 KB | 412.00 µs | 826.90 µs | 355.80 µs / 699.95 µs | 552.82 µs / 728.38 µs | 1.55× |
| xpub_sub (subs=1) | ipc | 64 KB | 49.64 µs | 44.26 µs | 48.58 µs / 58.73 µs | 39.48 µs / 49.42 µs | 0.81× (1.23× slower) |
| xpub_sub (subs=8) | ipc | 64 KB | 123.73 µs | 238.63 µs | 112.67 µs / 177.67 µs | 198.15 µs / 239.43 µs | 1.76× |
| xpub_sub (subs=64) | ipc | 64 KB | 902.26 µs | 1.69 ms | 717.51 µs / 1.27 ms | 1.22 ms / 1.73 ms | 1.71× |
| Pattern | Transport | Size | rustzmq2 |
|---|---|---|---|
| channel | tcp | 16 B | 84.36 µs |
| channel | tcp | 256 B | 84.91 µs |
| channel | tcp | 4 KB | 92.22 µs |
| channel | tcp | 64 KB | 150.43 µs |
| channel | ipc | 16 B | 55.05 µs |
| channel | ipc | 256 B | 54.62 µs |
| channel | ipc | 4 KB | 60.58 µs |
| channel | ipc | 64 KB | 96.89 µs |
| channel | inproc | 16 B | 1.15 µs |
| channel | inproc | 256 B | 1.16 µs |
| channel | inproc | 4 KB | 1.35 µs |
| channel | inproc | 64 KB | 3.55 µs |
| pub_xsub | inproc | 16 B | 527 ns |
| pub_xsub | inproc | 256 B | 535 ns |
| pub_xsub | inproc | 4 KB | 617 ns |
| pub_xsub | inproc | 64 KB | 1.54 µs |
| scatter_gather | tcp | 16 B | 43.96 µs |
| scatter_gather | tcp | 256 B | 44.45 µs |
| scatter_gather | tcp | 4 KB | 48.52 µs |
| scatter_gather | tcp | 64 KB | 63.01 µs |
| scatter_gather | ipc | 16 B | 27.29 µs |
| scatter_gather | ipc | 256 B | 27.17 µs |
| scatter_gather | ipc | 4 KB | 30.75 µs |
| scatter_gather | ipc | 64 KB | 50.21 µs |
| scatter_gather | inproc | 16 B | 636 ns |
| scatter_gather | inproc | 256 B | 641 ns |
| scatter_gather | inproc | 4 KB | 728 ns |
| scatter_gather | inproc | 64 KB | 1.80 µs |
| throughput/pub_fanout (subs=8) | inproc | 256 B | 2.58 ms |
| throughput/pub_fanout (subs=64) | inproc | 256 B | 16.00 ms |
| throughput/pub_fanout (subs=1) | inproc | 256 B | 1.14 ms |
| throughput/pub_fanout (subs=8) | inproc | 4 KB | 2.65 ms |
| throughput/pub_fanout (subs=64) | inproc | 4 KB | 15.80 ms |
| throughput/pub_fanout (subs=1) | inproc | 4 KB | 1.46 ms |