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 | 49.52 µs | 56.23 µs | — | — | 1.14× |
| pair | tcp | 256 B | 49.96 µs | 57.37 µs | — | — | 1.15× |
| pair | tcp | 4 KB | 54.17 µs | 60.44 µs | — | — | 1.12× |
| pair | tcp | 64 KB | 92.14 µs | 100.43 µs | — | — | 1.09× |
| pair | ipc | 16 B | 41.33 µs | 47.69 µs | — | — | 1.15× |
| pair | ipc | 256 B | 41.46 µs | 49.63 µs | — | — | 1.20× |
| pair | ipc | 4 KB | 46.11 µs | 52.54 µs | — | — | 1.14× |
| pair | ipc | 64 KB | 66.38 µs | 81.30 µs | — | — | 1.22× |
| pair | inproc | 16 B | 1.08 µs | 20.71 µs | — | — | 19.12× |
| pair | inproc | 256 B | 1.11 µs | 21.11 µs | — | — | 19.06× |
| pair | inproc | 4 KB | 1.28 µs | 22.61 µs | — | — | 17.60× |
| pair | inproc | 64 KB | 3.51 µs | 30.64 µs | — | — | 8.73× |
| pub_sub (subs=8) | tcp | 16 B | 75.52 µs | 133.49 µs | 68.56 µs / 95.38 µs | 91.94 µs / 140.30 µs | 1.34× |
| pub_sub (subs=1) | tcp | 16 B | 38.50 µs | 41.35 µs | 37.89 µs / 52.31 µs | 37.46 µs / 55.23 µs | 0.99× (1.01× slower) |
| pub_sub (subs=64) | tcp | 16 B | 401.48 µs | 897.70 µs | 344.08 µs / 487.35 µs | 632.58 µs / 906.68 µs | 1.84× |
| pub_sub (subs=8) | tcp | 256 B | 75.58 µs | 135.65 µs | 68.03 µs / 95.07 µs | 92.03 µs / 144.56 µs | 1.35× |
| pub_sub (subs=1) | tcp | 256 B | 38.93 µs | 42.18 µs | 37.30 µs / 51.12 µs | 38.40 µs / 47.52 µs | 1.03× |
| pub_sub (subs=64) | tcp | 256 B | 406.17 µs | 916.54 µs | 347.28 µs / 496.65 µs | 621.01 µs / 867.46 µs | 1.79× |
| pub_sub (subs=8) | tcp | 4 KB | 82.45 µs | 145.55 µs | 78.47 µs / 103.79 µs | 111.03 µs / 159.75 µs | 1.41× |
| pub_sub (subs=1) | tcp | 4 KB | 41.25 µs | 43.15 µs | 41.39 µs / 53.68 µs | 39.45 µs / 46.82 µs | 0.95× (1.05× slower) |
| pub_sub (subs=64) | tcp | 4 KB | 447.41 µs | 982.27 µs | 413.43 µs / 512.58 µs | 631.00 µs / 913.87 µs | 1.53× |
| pub_sub (subs=8) | tcp | 64 KB | 170.30 µs | 292.37 µs | 162.05 µs / 288.16 µs | 229.06 µs / 303.52 µs | 1.41× |
| pub_sub (subs=1) | tcp | 64 KB | 63.25 µs | 62.39 µs | 62.72 µs / 78.65 µs | 58.58 µs / 70.64 µs | 0.93× (1.07× slower) |
| pub_sub (subs=64) | tcp | 64 KB | 973.67 µs | 3.09 ms | 924.82 µs / 1.01 ms | 1.78 ms / 2.99 ms | 1.92× |
| pub_sub (subs=1) | ipc | 16 B | 34.35 µs | 35.85 µs | 33.72 µs / 40.66 µs | 32.17 µs / 37.25 µs | 0.95× (1.05× slower) |
| pub_sub (subs=64) | ipc | 16 B | 276.11 µs | 671.54 µs | 252.45 µs / 304.48 µs | 491.60 µs / 597.95 µs | 1.95× |
| pub_sub (subs=8) | ipc | 16 B | 55.98 µs | 99.96 µs | 51.11 µs / 67.16 µs | 62.02 µs / 92.55 µs | 1.21× |
| pub_sub (subs=1) | ipc | 256 B | 34.71 µs | 37.26 µs | 34.06 µs / 40.88 µs | 33.57 µs / 38.31 µs | 0.99× (1.01× slower) |
| pub_sub (subs=64) | ipc | 256 B | 286.02 µs | 687.59 µs | 260.05 µs / 315.33 µs | 518.00 µs / 620.84 µs | 1.99× |
| pub_sub (subs=8) | ipc | 256 B | 56.71 µs | 102.86 µs | 51.56 µs / 66.79 µs | 66.59 µs / 95.52 µs | 1.29× |
| pub_sub (subs=1) | ipc | 4 KB | 36.89 µs | 38.88 µs | 36.40 µs / 44.62 µs | 35.33 µs / 40.80 µs | 0.97× (1.03× slower) |
| pub_sub (subs=64) | ipc | 4 KB | 360.50 µs | 792.56 µs | 328.19 µs / 383.81 µs | 609.58 µs / 706.78 µs | 1.86× |
| pub_sub (subs=8) | ipc | 4 KB | 67.81 µs | 113.45 µs | 59.30 µs / 79.65 µs | 79.70 µs / 111.01 µs | 1.34× |
| pub_sub (subs=1) | ipc | 64 KB | 52.66 µs | 53.12 µs | 52.42 µs / 64.06 µs | 49.12 µs / 57.00 µs | 0.94× (1.07× slower) |
| pub_sub (subs=64) | ipc | 64 KB | 861.85 µs | 2.65 ms | 802.81 µs / 893.38 µs | 1.42 ms / 2.45 ms | 1.77× |
| pub_sub (subs=8) | ipc | 64 KB | 148.12 µs | 245.14 µs | 138.43 µs / 178.19 µs | 176.44 µs / 249.92 µs | 1.27× |
| pub_sub (subs=1) | inproc | 16 B | 671 ns | 16.02 µs | 424 ns / 448 ns | 12.71 µs / 13.92 µs | 29.98× |
| pub_sub (subs=64) | inproc | 16 B | 18.19 µs | 396.59 µs | 12.05 µs / 18.86 µs | 226.39 µs / 263.45 µs | 18.78× |
| pub_sub (subs=8) | inproc | 16 B | 2.61 µs | 59.56 µs | 1.68 µs / 2.46 µs | 30.75 µs / 44.65 µs | 18.31× |
| pub_sub (subs=1) | inproc | 256 B | 678 ns | 16.20 µs | 424 ns / 464 ns | 12.88 µs / 14.11 µs | 30.38× |
| pub_sub (subs=64) | inproc | 256 B | 18.20 µs | 393.81 µs | 12.18 µs / 20.35 µs | 220.07 µs / 259.03 µs | 18.06× |
| pub_sub (subs=8) | inproc | 256 B | 2.63 µs | 61.45 µs | 1.69 µs / 2.46 µs | 37.60 µs / 50.31 µs | 22.29× |
| pub_sub (subs=1) | inproc | 4 KB | 756 ns | 16.57 µs | 504 ns / 543 ns | 13.58 µs / 14.61 µs | 26.95× |
| pub_sub (subs=64) | inproc | 4 KB | 18.58 µs | 403.03 µs | 12.39 µs / 19.93 µs | 227.28 µs / 271.08 µs | 18.34× |
| pub_sub (subs=8) | inproc | 4 KB | 2.70 µs | 62.42 µs | 1.78 µs / 2.52 µs | 33.92 µs / 47.98 µs | 19.10× |
| pub_sub (subs=1) | inproc | 64 KB | 1.75 µs | 18.99 µs | 1.47 µs / 1.53 µs | 15.50 µs / 19.78 µs | 10.53× |
| pub_sub (subs=64) | inproc | 64 KB | 19.87 µs | 426.72 µs | 13.86 µs / 22.73 µs | 253.04 µs / 311.40 µs | 18.25× |
| pub_sub (subs=8) | inproc | 64 KB | 3.74 µs | 67.56 µs | 2.80 µs / 3.58 µs | 44.63 µs / 65.71 µs | 15.94× |
| pub_xsub | tcp | 16 B | 41.91 µs | 29.44 µs | — | — | 0.70× (1.42× slower) |
| pub_xsub | tcp | 256 B | 41.34 µs | 30.22 µs | — | — | 0.73× (1.37× slower) |
| pub_xsub | tcp | 4 KB | 43.32 µs | 30.67 µs | — | — | 0.71× (1.41× slower) |
| pub_xsub | tcp | 64 KB | 63.87 µs | 48.86 µs | — | — | 0.76× (1.31× slower) |
| pub_xsub | ipc | 16 B | 34.19 µs | 23.47 µs | — | — | 0.69× (1.46× slower) |
| pub_xsub | ipc | 256 B | 34.13 µs | 24.44 µs | — | — | 0.72× (1.40× slower) |
| pub_xsub | ipc | 4 KB | 36.02 µs | 26.04 µs | — | — | 0.72× (1.38× slower) |
| pub_xsub | ipc | 64 KB | 52.03 µs | 39.69 µs | — | — | 0.76× (1.31× slower) |
| push_pull | tcp | 16 B | 39.53 µs | 29.13 µs | — | — | 0.74× (1.36× slower) |
| push_pull | tcp | 256 B | 39.40 µs | 30.28 µs | — | — | 0.77× (1.30× slower) |
| push_pull | tcp | 4 KB | 43.27 µs | 30.66 µs | — | — | 0.71× (1.41× slower) |
| push_pull | tcp | 64 KB | 60.27 µs | 48.05 µs | — | — | 0.80× (1.25× slower) |
| push_pull | ipc | 16 B | 31.98 µs | 23.87 µs | — | — | 0.75× (1.34× slower) |
| push_pull | ipc | 256 B | 32.11 µs | 24.63 µs | — | — | 0.77× (1.30× slower) |
| push_pull | ipc | 4 KB | 34.40 µs | 25.93 µs | — | — | 0.75× (1.33× slower) |
| push_pull | ipc | 64 KB | 47.37 µs | 40.19 µs | — | — | 0.85× (1.18× slower) |
| push_pull | inproc | 16 B | 615 ns | 160 ns | — | — | 0.26× (3.85× slower) |
| push_pull | inproc | 256 B | 622 ns | 173 ns | — | — | 0.28× (3.61× slower) |
| push_pull | inproc | 4 KB | 707 ns | 360 ns | — | — | 0.51× (1.97× slower) |
| push_pull | inproc | 64 KB | 1.78 µs | 2.48 µs | — | — | 1.39× |
| req_rep | tcp | 16 B | 50.21 µs | 57.34 µs | — | — | 1.14× |
| req_rep | tcp | 256 B | 50.93 µs | 59.04 µs | — | — | 1.16× |
| req_rep | tcp | 4 KB | 57.11 µs | 61.89 µs | — | — | 1.08× |
| req_rep | tcp | 64 KB | 98.05 µs | 101.50 µs | — | — | 1.04× |
| req_rep | ipc | 16 B | 41.38 µs | 49.85 µs | — | — | 1.20× |
| req_rep | ipc | 256 B | 41.69 µs | 52.14 µs | — | — | 1.25× |
| req_rep | ipc | 4 KB | 47.29 µs | 55.14 µs | — | — | 1.17× |
| req_rep | ipc | 64 KB | 67.05 µs | 85.23 µs | — | — | 1.27× |
| req_rep | inproc | 16 B | 949 ns | 21.95 µs | — | — | 23.14× |
| req_rep | inproc | 256 B | 963 ns | 22.25 µs | — | — | 23.10× |
| req_rep | inproc | 4 KB | 1.17 µs | 23.95 µs | — | — | 20.51× |
| req_rep | inproc | 64 KB | 3.32 µs | 31.58 µs | — | — | 9.50× |
| throughput/dealer_router | tcp | 256 B | 7.47 ms | 1.84 ms | — | — | 0.25× (4.06× slower) |
| throughput/dealer_router | tcp | 4 KB | 9.32 ms | 10.84 ms | — | — | 1.16× |
| throughput/dealer_router | ipc | 256 B | 3.35 ms | 1.66 ms | — | — | 0.50× (2.01× slower) |
| throughput/dealer_router | ipc | 4 KB | 6.50 ms | 8.24 ms | — | — | 1.27× |
| throughput/dealer_router | inproc | 256 B | 882.33 µs | 1.32 ms | — | — | 1.50× |
| throughput/dealer_router | inproc | 4 KB | 832.42 µs | 2.22 ms | — | — | 2.67× |
| throughput/pub_fanout (subs=8) | tcp | 256 B | 15.25 ms | 4.73 ms | — | — | 0.31× (3.22× slower) |
| throughput/pub_fanout (subs=64) | tcp | 256 B | 103.28 ms | 39.69 ms | — | — | 0.38× (2.60× slower) |
| throughput/pub_fanout (subs=1) | tcp | 256 B | 4.15 ms | 847.96 µs | — | — | 0.20× (4.89× slower) |
| throughput/pub_fanout (subs=8) | tcp | 4 KB | 23.07 ms | 51.12 ms | — | — | 2.22× |
| throughput/pub_fanout (subs=64) | tcp | 4 KB | 161.97 ms | 463.24 ms | — | — | 2.86× |
| throughput/pub_fanout (subs=1) | tcp | 4 KB | 4.96 ms | 5.20 ms | — | — | 1.05× |
| throughput/pub_fanout (subs=64) | ipc | 256 B | 67.15 ms | 29.36 ms | — | — | 0.44× (2.29× slower) |
| throughput/pub_fanout (subs=1) | ipc | 256 B | 1.92 ms | 773.61 µs | — | — | 0.40× (2.49× slower) |
| throughput/pub_fanout (subs=8) | ipc | 256 B | 9.18 ms | 3.51 ms | — | — | 0.38× (2.62× slower) |
| throughput/pub_fanout (subs=64) | ipc | 4 KB | 143.38 ms | 304.65 ms | — | — | 2.12× |
| throughput/pub_fanout (subs=1) | ipc | 4 KB | 3.26 ms | 2.89 ms | — | — | 0.89× (1.13× slower) |
| throughput/pub_fanout (subs=8) | ipc | 4 KB | 19.32 ms | 29.79 ms | — | — | 1.54× |
| xpub_sub (subs=64) | tcp | 16 B | 435.85 µs | 861.57 µs | 409.30 µs / 478.05 µs | 566.01 µs / 856.58 µs | 1.38× |
| xpub_sub (subs=8) | tcp | 16 B | 83.61 µs | 130.54 µs | 77.98 µs / 99.40 µs | 90.02 µs / 137.87 µs | 1.15× |
| xpub_sub (subs=1) | tcp | 16 B | 41.62 µs | 40.85 µs | 39.74 µs / 54.26 µs | 37.23 µs / 44.79 µs | 0.94× (1.07× slower) |
| xpub_sub (subs=64) | tcp | 256 B | 434.94 µs | 882.34 µs | 390.73 µs / 458.01 µs | 595.25 µs / 868.43 µs | 1.52× |
| xpub_sub (subs=8) | tcp | 256 B | 84.84 µs | 132.56 µs | 79.78 µs / 100.59 µs | 92.94 µs / 141.54 µs | 1.16× |
| xpub_sub (subs=1) | tcp | 256 B | 41.94 µs | 41.55 µs | 41.07 µs / 56.09 µs | 38.02 µs / 44.78 µs | 0.93× (1.08× slower) |
| xpub_sub (subs=64) | tcp | 4 KB | 498.41 µs | 935.38 µs | 481.07 µs / 547.27 µs | 605.03 µs / 862.76 µs | 1.26× |
| xpub_sub (subs=8) | tcp | 4 KB | 93.74 µs | 141.14 µs | 88.64 µs / 114.92 µs | 106.43 µs / 159.32 µs | 1.20× |
| xpub_sub (subs=1) | tcp | 4 KB | 46.18 µs | 42.21 µs | 46.62 µs / 60.08 µs | 38.48 µs / 45.69 µs | 0.83× (1.21× slower) |
| xpub_sub (subs=64) | tcp | 64 KB | 973.65 µs | 3.00 ms | 925.69 µs / 1.02 ms | 1.36 ms / 2.39 ms | 1.47× |
| xpub_sub (subs=8) | tcp | 64 KB | 171.01 µs | 283.05 µs | 160.96 µs / 201.69 µs | 241.71 µs / 310.92 µs | 1.50× |
| xpub_sub (subs=1) | tcp | 64 KB | 65.34 µs | 61.34 µs | 65.09 µs / 80.88 µs | 57.27 µs / 69.88 µs | 0.88× (1.14× slower) |
| xpub_sub (subs=1) | ipc | 16 B | 34.86 µs | 35.00 µs | 34.11 µs / 40.58 µs | 31.47 µs / 36.42 µs | 0.92× (1.08× slower) |
| xpub_sub (subs=64) | ipc | 16 B | 275.00 µs | 636.25 µs | 242.65 µs / 293.46 µs | 468.95 µs / 568.12 µs | 1.93× |
| xpub_sub (subs=8) | ipc | 16 B | 56.99 µs | 96.09 µs | 51.06 µs / 67.05 µs | 62.03 µs / 91.03 µs | 1.21× |
| xpub_sub (subs=1) | ipc | 256 B | 35.07 µs | 36.00 µs | 34.52 µs / 41.61 µs | 32.55 µs / 37.52 µs | 0.94× (1.06× slower) |
| xpub_sub (subs=64) | ipc | 256 B | 282.82 µs | 655.08 µs | 250.62 µs / 305.85 µs | 490.37 µs / 593.48 µs | 1.96× |
| xpub_sub (subs=8) | ipc | 256 B | 57.72 µs | 98.28 µs | 51.87 µs / 68.31 µs | 63.19 µs / 91.95 µs | 1.22× |
| xpub_sub (subs=1) | ipc | 4 KB | 37.05 µs | 37.90 µs | 36.13 µs / 44.43 µs | 34.81 µs / 40.25 µs | 0.96× (1.04× slower) |
| xpub_sub (subs=64) | ipc | 4 KB | 351.65 µs | 752.27 µs | 322.24 µs / 378.23 µs | 594.54 µs / 680.08 µs | 1.84× |
| xpub_sub (subs=8) | ipc | 4 KB | 68.40 µs | 108.80 µs | 60.79 µs / 80.11 µs | 75.24 µs / 103.16 µs | 1.24× |
| xpub_sub (subs=1) | ipc | 64 KB | 54.14 µs | 51.68 µs | 53.30 µs / 65.45 µs | 47.81 µs / 55.33 µs | 0.90× (1.11× slower) |
| xpub_sub (subs=64) | ipc | 64 KB | 859.62 µs | 1.65 ms | 825.65 µs / 937.06 µs | 1.13 ms / 1.83 ms | 1.36× |
| xpub_sub (subs=8) | ipc | 64 KB | 150.82 µs | 237.23 µs | 138.66 µs / 177.16 µs | 173.42 µs / 242.10 µs | 1.25× |
| Pattern | Transport | Size | rustzmq2 |
|---|---|---|---|
| channel | tcp | 16 B | 69.83 µs |
| channel | tcp | 256 B | 70.56 µs |
| channel | tcp | 4 KB | 80.78 µs |
| channel | tcp | 64 KB | 127.35 µs |
| channel | ipc | 16 B | 63.02 µs |
| channel | ipc | 256 B | 63.57 µs |
| channel | ipc | 4 KB | 67.42 µs |
| channel | ipc | 64 KB | 96.23 µs |
| channel | inproc | 16 B | 1.12 µs |
| channel | inproc | 256 B | 1.15 µs |
| channel | inproc | 4 KB | 1.33 µs |
| channel | inproc | 64 KB | 3.52 µs |
| pub_xsub | inproc | 16 B | 534 ns |
| pub_xsub | inproc | 256 B | 534 ns |
| pub_xsub | inproc | 4 KB | 632 ns |
| pub_xsub | inproc | 64 KB | 1.54 µs |
| scatter_gather | tcp | 16 B | 38.79 µs |
| scatter_gather | tcp | 256 B | 39.30 µs |
| scatter_gather | tcp | 4 KB | 43.13 µs |
| scatter_gather | tcp | 64 KB | 60.11 µs |
| scatter_gather | ipc | 16 B | 32.25 µs |
| scatter_gather | ipc | 256 B | 32.32 µs |
| scatter_gather | ipc | 4 KB | 34.64 µs |
| scatter_gather | ipc | 64 KB | 48.18 µs |
| scatter_gather | inproc | 16 B | 619 ns |
| scatter_gather | inproc | 256 B | 629 ns |
| scatter_gather | inproc | 4 KB | 714 ns |
| scatter_gather | inproc | 64 KB | 1.80 µs |
| throughput/pub_fanout (subs=64) | inproc | 256 B | 11.72 ms |
| throughput/pub_fanout (subs=1) | inproc | 256 B | 1.07 ms |
| throughput/pub_fanout (subs=8) | inproc | 256 B | 1.84 ms |
| throughput/pub_fanout (subs=64) | inproc | 4 KB | 11.75 ms |
| throughput/pub_fanout (subs=1) | inproc | 4 KB | 1.50 ms |
| throughput/pub_fanout (subs=8) | inproc | 4 KB | 2.73 ms |