Benchmark report · 14 November 2026
Pipe, beside seven other clients.
Four rigs — the engine alone, a Mac, an Android phone and an iPhone — 9 protocols, and the same server and the same iperf3 for everyone. Pipe is ahead of or level with the best other client in 180 of 204 throughput tests. It trails in 24, and they are all here.
180/204
throughput tests ahead or level
1.7×
less CPU a gigabyte than the best other engine
2.3×
less memory at peak than the lightest other engine
4.5×
less CPU a gigabyte than the best other Android app
The result, rig by rig
A test is one protocol, one direction and a number of parallel streams, run for ten seconds through each client in turn. Pipe is ahead when it beats the best other client by more than 5%, level within 5% either way, and behind below that.
Throughput, test by test
Pipe against the best other client in each test. Level is within 5%.
- The engine never trails. Against sing-box, Xray and mihomo it is ahead in 43 tests and level in the other 11, on 1.7× less CPU and 2.3× less memory than the best of them.
- The apps carry it through. With the whole client and its tunnel in the path, Pipe is ahead of or level with Surge Mac and FlClash in 55 of 60 tests, and with FlClash and Surfboard on Android in 33 of 36.
- The iPhone is the close one. Ahead or level in 38 of 54: well ahead of Clash; against Surge, ahead in most QUIC, VMess and AnyTLS tests, and under it in most Shadowsocks and VLESS tests.
One Mac, loopback · the engines alone
The engine
Each engine runs as an ordinary process with a forwarded port in and one protocol out, to the same pinned server. No tunnel and no app: this is what the cores themselves can do, and what they spend doing it.
- Pipe 079ed34f
- sing-box 1.14.4
- Xray 26.11.9
- mihomo 1.19.33
Throughput
54/54
ahead or level
43 ahead11 level0 behind1.27× the best other client’s, as a geometric mean
CPU per gigabyte
52/54
ahead or level
49 ahead3 level2 behind1.74× less than the best other client, as a geometric mean
Memory
53/54
ahead or level
51 ahead2 level1 behind2.32× less than the best other client, as a geometric mean
What a gigabyte costs
CPU seconds each engine spent to carry one GiB, eight downloads at once. On a phone this is battery; on any device it is heat. Pipe spends 6.11 seconds a GiB on Hysteria 2 where the Go cores spend 26.47 to 34.26, and 8.52 on WireGuard where they spend 43.14 to 64.40.
SOCKS5
Shadowsocks
VMess
VLESS
Trojan
AnyTLS
Hysteria 2
TUIC
WireGuard
What it holds
Peak memory during the same test. Pipe has no garbage collector and leases every buffer from one budget, so its footprint follows the work: 5 MiB on a single download, 11 on sixty-four.
SOCKS5
Shadowsocks
VMess
VLESS
Trojan
AnyTLS
Hysteria 2
TUIC
WireGuard
How fast it goes
On loopback the server caps the fastest protocols on a single stream, so there several engines read alike and CPU is what tells them apart. With eight streams the engines themselves are the limit, and Pipe carries 9.1 Gbit/s of Shadowsocks where the best other carries 6.0.
SOCKS5
Shadowsocks
VMess
VLESS
Trojan
AnyTLS
Hysteria 2
TUIC
WireGuard
Every test
Each square is one test: Pipe’s figure, and its difference from the best other client’s. Arrows are the direction, the number beside them the streams.
aheadlevelbehind
| Protocol | download, 1 stream | download, 8 streams | download, 64 streams | upload, 1 stream | upload, 8 streams | upload, 64 streams |
|---|---|---|---|---|---|---|
| SOCKS5 | +4%11,194 | +62%10,631 | +2%8,432 | +5%9,907 | +45%9,725 | +5%8,498 |
| Shadowsocks | −3%10,822 | +52%9,074 | −2%7,686 | +12%10,607 | +29%9,050 | +2%7,784 |
| VMess | −3%7,603 | +27%8,791 | +7%7,736 | +11%8,583 | +38%8,519 | +11%7,897 |
| VLESS | +2%7,603 | +42%7,314 | +8%7,510 | +18%8,582 | +30%6,951 | +12%7,700 |
| Trojan | +8%7,564 | +40%7,322 | +7%7,432 | +25%8,658 | +33%7,018 | +8%7,621 |
| AnyTLS | −5%6,501 | +32%6,849 | +3%7,151 | +72%11,663 | +59%8,189 | +11%7,716 |
| Hysteria 2 | +10%1,207 | +85%1,266 | +15%778 | +6%1,901 | ×2.11,847 | ×2.51,840 |
| TUIC | +7%1,217 | +91%1,329 | +35%914 | +3%1,884 | ×2.21,860 | ×2.51,853 |
| WireGuard | +30%764 | +39%762 | +25%690 | +12%1,673 | +33%1,436 | +43%1,498 |
| Protocol | download, 1 stream | download, 8 streams | download, 64 streams | upload, 1 stream | upload, 8 streams | upload, 64 streams |
|---|---|---|---|---|---|---|
| SOCKS5 | −20%0.61 | −48%0.68 | −3%0.56 | −21%0.66 | −42%0.71 | −18%0.45 |
| Shadowsocks | +9%0.82 | −51%1.03 | −7%0.78 | +53%0.72 | −31%0.96 | −14%0.69 |
| VMess | +1%1.18 | −20%1.36 | −1%1.14 | −40%0.67 | −39%1.10 | −10%0.88 |
| VLESS | −14%1.08 | −43%1.20 | −9%0.97 | −53%0.42 | −56%0.86 | −32%0.69 |
| Trojan | −14%1.08 | −34%1.30 | −11%0.96 | −64%0.42 | −53%0.92 | −23%0.70 |
| AnyTLS | −9%1.55 | −38%1.57 | −29%1.10 | −72%0.47 | −56%1.08 | −32%0.77 |
| Hysteria 2 | −56%6.68 | −77%6.11 | −50%14.72 | −31%5.49 | −42%6.04 | −40%5.71 |
| TUIC | −62%6.07 | −79%5.68 | −55%13.35 | −26%5.75 | −44%5.93 | −41%5.58 |
| WireGuard | −78%8.59 | −80%8.52 | −74%12.93 | −60%5.56 | −75%6.46 | −70%5.97 |
| Protocol | download, 1 stream | download, 8 streams | download, 64 streams | upload, 1 stream | upload, 8 streams | upload, 64 streams |
|---|---|---|---|---|---|---|
| SOCKS5 | −71%5 | −67%6 | −50%11 | −69%5 | −67%6 | −50%11 |
| Shadowsocks | −72%5 | −58%8 | −39%19 | −69%5 | −62%7 | −13%20 |
| VMess | −69%6 | −58%9 | −28%22 | −68%6 | −55%9 | −13%27 |
| VLESS | −69%5 | −61%8 | −35%20 | −66%6 | −61%8 | −37%18 |
| Trojan | −69%5 | −62%7 | −40%18 | −65%6 | −59%8 | −37%19 |
| AnyTLS | −68%6 | −54%10 | −38%24 | −70%5 | −60%9 | −36%24 |
| Hysteria 2 | −67%6 | −65%7 | −68%7 | −51%9 | −32%13 | −0%29 |
| TUIC | −67%6 | −66%7 | −68%8 | −50%10 | −43%12 | −1%30 |
| WireGuard | −67%7 | −76%7 | −85%12 | −81%12 | −24%62 | +23%121 |
Every figure 54 tests × 4 clients
| Test | Pipe | sing-box | Xray | mihomo |
|---|---|---|---|---|
| SOCKS5 ↓ 1 | 11,194 | 7,688 | 10,726 | 10,200 |
| SOCKS5 ↑ 1 | 9,907 | 7,713 | 9,403 | 8,842 |
| SOCKS5 ↓ 8 | 10,631 | 6,522 | 6,581 | 5,511 |
| SOCKS5 ↑ 8 | 9,725 | 6,476 | 6,710 | 6,556 |
| SOCKS5 ↓ 64 | 8,432 | 7,834 | 8,233 | 8,087 |
| SOCKS5 ↑ 64 | 8,498 | 7,705 | 8,099 | 8,117 |
| Shadowsocks ↓ 1 | 10,822 | 10,777 | 10,939 | 11,182 |
| Shadowsocks ↑ 1 | 10,607 | 9,450 | 6,905 | 9,193 |
| Shadowsocks ↓ 8 | 9,074 | 5,261 | 4,902 | 5,958 |
| Shadowsocks ↑ 8 | 9,050 | 6,222 | 5,294 | 6,993 |
| Shadowsocks ↓ 64 | 7,686 | 7,872 | 7,811 | 7,639 |
| Shadowsocks ↑ 64 | 7,784 | 7,325 | 6,121 | 7,625 |
| VMess ↓ 1 | 7,603 | 7,832 | 7,400 | 7,818 |
| VMess ↑ 1 | 8,583 | 7,754 | 4,998 | 6,985 |
| VMess ↓ 8 | 8,791 | 5,570 | 6,942 | 6,315 |
| VMess ↑ 8 | 8,519 | 5,578 | 4,719 | 6,185 |
| VMess ↓ 64 | 7,736 | 6,696 | 7,207 | 7,207 |
| VMess ↑ 64 | 7,897 | 7,079 | 6,043 | 7,116 |
| VLESS ↓ 1 | 7,603 | 7,452 | 6,723 | 7,049 |
| VLESS ↑ 1 | 8,582 | 7,001 | 7,279 | 6,869 |
| VLESS ↓ 8 | 7,314 | 5,148 | 4,629 | 5,163 |
| VLESS ↑ 8 | 6,951 | 5,124 | 4,891 | 5,332 |
| VLESS ↓ 64 | 7,510 | 6,825 | 6,335 | 6,961 |
| VLESS ↑ 64 | 7,700 | 6,840 | 6,205 | 6,867 |
| Trojan ↓ 1 | 7,564 | 7,023 | 6,738 | 6,967 |
| Trojan ↑ 1 | 8,658 | 6,926 | 6,870 | 6,816 |
| Trojan ↓ 8 | 7,322 | 5,121 | 4,603 | 5,221 |
| Trojan ↑ 8 | 7,018 | 5,122 | 4,929 | 5,295 |
| Trojan ↓ 64 | 7,432 | 6,929 | 6,574 | 6,182 |
| Trojan ↑ 64 | 7,621 | 6,477 | 6,386 | 7,033 |
| AnyTLS ↓ 1 | 6,501 | 6,826 | — | 6,580 |
| AnyTLS ↑ 1 | 11,663 | 6,763 | — | 5,973 |
| AnyTLS ↓ 8 | 6,849 | 5,182 | — | 4,936 |
| AnyTLS ↑ 8 | 8,189 | 5,150 | — | 4,779 |
| AnyTLS ↓ 64 | 7,151 | 6,961 | — | 6,743 |
| AnyTLS ↑ 64 | 7,716 | 6,948 | — | 6,642 |
| Hysteria 2 ↓ 1 | 1,207 | 1,098 | 983 | 991 |
| Hysteria 2 ↑ 1 | 1,901 | 1,796 | 716 | 733 |
| Hysteria 2 ↓ 8 | 1,266 | 685 | 681 | 684 |
| Hysteria 2 ↑ 8 | 1,847 | 879 | 620 | 652 |
| Hysteria 2 ↓ 64 | 778 | 674 | 664 | 670 |
| Hysteria 2 ↑ 64 | 1,840 | 742 | 604 | 624 |
| TUIC ↓ 1 | 1,217 | 1,135 | — | 999 |
| TUIC ↑ 1 | 1,884 | 1,836 | — | 732 |
| TUIC ↓ 8 | 1,329 | 697 | — | 674 |
| TUIC ↑ 8 | 1,860 | 852 | — | 659 |
| TUIC ↓ 64 | 914 | 678 | — | 674 |
| TUIC ↑ 64 | 1,853 | 741 | — | 636 |
| WireGuard ↓ 1 | 764 | 555 | 507 | 589 |
| WireGuard ↑ 1 | 1,673 | 1,258 | 626 | 1,500 |
| WireGuard ↓ 8 | 762 | 489 | 427 | 549 |
| WireGuard ↑ 8 | 1,436 | 1,080 | 499 | 440 |
| WireGuard ↓ 64 | 690 | 498 | failed | 552 |
| WireGuard ↑ 64 | 1,498 | 1,046 | 495 | 286 |
| Test | Pipe | sing-box | Xray | mihomo |
|---|---|---|---|---|
| SOCKS5 ↓ 1 | 0.61 | 1.01 | 0.76 | 0.81 |
| SOCKS5 ↑ 1 | 0.66 | 0.90 | 0.84 | 0.88 |
| SOCKS5 ↓ 8 | 0.68 | 1.30 | 1.53 | 1.60 |
| SOCKS5 ↑ 8 | 0.71 | 1.26 | 1.31 | 1.23 |
| SOCKS5 ↓ 64 | 0.56 | 0.58 | 0.75 | 0.77 |
| SOCKS5 ↑ 64 | 0.45 | 0.58 | 0.55 | 0.68 |
| Shadowsocks ↓ 1 | 0.82 | 0.75 | 0.85 | 1.53 |
| Shadowsocks ↑ 1 | 0.72 | 0.47 | 0.68 | 0.88 |
| Shadowsocks ↓ 8 | 1.03 | 2.09 | 2.11 | 2.22 |
| Shadowsocks ↑ 8 | 0.96 | 1.61 | 1.54 | 1.40 |
| Shadowsocks ↓ 64 | 0.78 | 0.84 | 0.89 | 1.52 |
| Shadowsocks ↑ 64 | 0.69 | 0.87 | 1.05 | 0.80 |
| VMess ↓ 1 | 1.18 | 1.17 | 1.59 | 1.26 |
| VMess ↑ 1 | 0.67 | 1.23 | 1.89 | 1.11 |
| VMess ↓ 8 | 1.36 | 1.97 | 1.69 | 1.92 |
| VMess ↑ 8 | 1.10 | 1.90 | 2.35 | 1.79 |
| VMess ↓ 64 | 1.14 | 1.15 | 1.24 | 1.16 |
| VMess ↑ 64 | 0.88 | 0.98 | 1.43 | 1.18 |
| VLESS ↓ 1 | 1.08 | 1.27 | 1.31 | 1.26 |
| VLESS ↑ 1 | 0.42 | 1.44 | 0.90 | 1.47 |
| VLESS ↓ 8 | 1.20 | 2.12 | 2.11 | 2.13 |
| VLESS ↑ 8 | 0.86 | 2.13 | 1.95 | 2.06 |
| VLESS ↓ 64 | 0.97 | 1.13 | 1.19 | 1.07 |
| VLESS ↑ 64 | 0.69 | 1.02 | 1.09 | 1.01 |
| Trojan ↓ 1 | 1.08 | 1.26 | 1.32 | 1.26 |
| Trojan ↑ 1 | 0.42 | 1.33 | 1.18 | 1.47 |
| Trojan ↓ 8 | 1.30 | 1.96 | 2.33 | 2.11 |
| Trojan ↑ 8 | 0.92 | 2.12 | 1.95 | 2.06 |
| Trojan ↓ 64 | 0.96 | 1.08 | 1.19 | 1.23 |
| Trojan ↑ 64 | 0.70 | 0.97 | 1.05 | 0.91 |
| AnyTLS ↓ 1 | 1.55 | 1.71 | — | 1.82 |
| AnyTLS ↑ 1 | 0.47 | 1.65 | — | 1.66 |
| AnyTLS ↓ 8 | 1.57 | 2.55 | — | 2.99 |
| AnyTLS ↑ 8 | 1.08 | 2.48 | — | 2.64 |
| AnyTLS ↓ 64 | 1.10 | 1.54 | — | 1.78 |
| AnyTLS ↑ 64 | 0.77 | 1.14 | — | 1.15 |
| Hysteria 2 ↓ 1 | 6.68 | 15.20 | 23.58 | 23.39 |
| Hysteria 2 ↑ 1 | 5.49 | 7.91 | 28.56 | 27.60 |
| Hysteria 2 ↓ 8 | 6.11 | 26.47 | 34.26 | 33.67 |
| Hysteria 2 ↑ 8 | 6.04 | 10.49 | 22.98 | 22.14 |
| Hysteria 2 ↓ 64 | 14.72 | 29.69 | 35.07 | 34.40 |
| Hysteria 2 ↑ 64 | 5.71 | 9.58 | 22.75 | 19.89 |
| TUIC ↓ 1 | 6.07 | 16.11 | — | 25.17 |
| TUIC ↑ 1 | 5.75 | 7.78 | — | 25.57 |
| TUIC ↓ 8 | 5.68 | 26.46 | — | 33.97 |
| TUIC ↑ 8 | 5.93 | 10.58 | — | 24.32 |
| TUIC ↓ 64 | 13.35 | 29.40 | — | 31.51 |
| TUIC ↑ 64 | 5.58 | 9.50 | — | 19.34 |
| WireGuard ↓ 1 | 8.59 | 41.36 | 50.25 | 39.56 |
| WireGuard ↑ 1 | 5.56 | 26.85 | 32.18 | 13.79 |
| WireGuard ↓ 8 | 8.52 | 51.46 | 64.40 | 43.14 |
| WireGuard ↑ 8 | 6.46 | 25.80 | 47.59 | 40.18 |
| WireGuard ↓ 64 | 12.93 | 49.61 | failed | 49.14 |
| WireGuard ↑ 64 | 5.97 | 19.62 | 37.29 | 42.28 |
| Test | Pipe | sing-box | Xray | mihomo |
|---|---|---|---|---|
| SOCKS5 ↓ 1 | 5 | 20 | 16 | 19 |
| SOCKS5 ↑ 1 | 5 | 19 | 16 | 18 |
| SOCKS5 ↓ 8 | 6 | 26 | 17 | 19 |
| SOCKS5 ↑ 8 | 6 | 27 | 18 | 19 |
| SOCKS5 ↓ 64 | 11 | 66 | 26 | 21 |
| SOCKS5 ↑ 64 | 11 | 65 | 28 | 22 |
| Shadowsocks ↓ 1 | 5 | 18 | 17 | 21 |
| Shadowsocks ↑ 1 | 5 | 18 | 16 | 17 |
| Shadowsocks ↓ 8 | 8 | 23 | 19 | 40 |
| Shadowsocks ↑ 8 | 7 | 21 | 19 | 18 |
| Shadowsocks ↓ 64 | 19 | 32 | 42 | 31 |
| Shadowsocks ↑ 64 | 20 | 31 | 34 | 23 |
| VMess ↓ 1 | 6 | 18 | 18 | 19 |
| VMess ↑ 1 | 6 | 17 | 18 | 19 |
| VMess ↓ 8 | 9 | 22 | 21 | 21 |
| VMess ↑ 8 | 9 | 21 | 20 | 21 |
| VMess ↓ 64 | 22 | 35 | 33 | 30 |
| VMess ↑ 64 | 27 | 31 | 35 | 34 |
| VLESS ↓ 1 | 5 | 18 | 17 | 18 |
| VLESS ↑ 1 | 6 | 17 | 17 | 19 |
| VLESS ↓ 8 | 8 | 22 | 19 | 20 |
| VLESS ↑ 8 | 8 | 20 | 20 | 20 |
| VLESS ↓ 64 | 20 | 37 | 33 | 30 |
| VLESS ↑ 64 | 18 | 30 | 33 | 28 |
| Trojan ↓ 1 | 5 | 19 | 17 | 18 |
| Trojan ↑ 1 | 6 | 17 | 17 | 18 |
| Trojan ↓ 8 | 7 | 21 | 19 | 20 |
| Trojan ↑ 8 | 8 | 21 | 19 | 20 |
| Trojan ↓ 64 | 18 | 34 | 32 | 30 |
| Trojan ↑ 64 | 19 | 31 | 34 | 30 |
| AnyTLS ↓ 1 | 6 | 19 | — | 19 |
| AnyTLS ↑ 1 | 5 | 18 | — | 18 |
| AnyTLS ↓ 8 | 10 | 23 | — | 22 |
| AnyTLS ↑ 8 | 9 | 25 | — | 23 |
| AnyTLS ↓ 64 | 24 | 44 | — | 38 |
| AnyTLS ↑ 64 | 24 | 42 | — | 38 |
| Hysteria 2 ↓ 1 | 6 | 21 | 19 | 20 |
| Hysteria 2 ↑ 1 | 9 | 22 | 19 | 19 |
| Hysteria 2 ↓ 8 | 7 | 22 | 19 | 21 |
| Hysteria 2 ↑ 8 | 13 | 23 | 20 | 21 |
| Hysteria 2 ↓ 64 | 7 | 30 | 22 | 25 |
| Hysteria 2 ↑ 64 | 29 | 36 | 29 | 30 |
| TUIC ↓ 1 | 6 | 21 | — | 19 |
| TUIC ↑ 1 | 10 | 21 | — | 20 |
| TUIC ↓ 8 | 7 | 22 | — | 20 |
| TUIC ↑ 8 | 12 | 22 | — | 21 |
| TUIC ↓ 64 | 8 | 30 | — | 26 |
| TUIC ↑ 64 | 30 | 34 | — | 30 |
| WireGuard ↓ 1 | 7 | 56 | 22 | 37 |
| WireGuard ↑ 1 | 12 | 154 | 59 | 213 |
| WireGuard ↓ 8 | 7 | 120 | 30 | 70 |
| WireGuard ↑ 8 | 62 | 182 | 155 | 81 |
| WireGuard ↓ 64 | 12 | 131 | failed | 81 |
| WireGuard ↑ 64 | 121 | 332 | 241 | 98 |
A macOS 27 virtual machine to its host · the whole app, tunnel on
Mac app
Each app as it ships, in Rule mode with its tunnel on, one at a time in the same virtual machine. The first row, Direct, is the tunnel with no proxy behind it: what the app itself costs every connection.
- Pipe 079ed34f
- Surge Mac 6.12.0
- FlClash 0.9.3
Throughput
55/60
ahead or level
46 ahead9 level5 behind1.28× the best other client’s, as a geometric mean
Through its tunnel alone Pipe moves 13.8 Gbit/s on one download; Surge Mac moves 7.0 and FlClash 10.5. With eight downloads through a proxy it carries 10.8 Gbit/s of Trojan where the best other carries 7.3. Surge Mac does not take a VLESS proxy, and its WireGuard did not finish a run on this rig.
Direct
SOCKS5
Shadowsocks
VMess
VLESS
Trojan
AnyTLS
Hysteria 2
TUIC
WireGuard
Every test
| Protocol | download, 1 stream | download, 8 streams | download, 64 streams | upload, 1 stream | upload, 8 streams | upload, 64 streams |
|---|---|---|---|---|---|---|
| Direct | +31%13,805 | +30%10,279 | +41%8,780 | +11%14,988 | +27%13,996 | +11%10,391 |
| SOCKS5 | +7%11,131 | +55%11,354 | +99%10,561 | +1%11,189 | +7%9,749 | +5%6,526 |
| Shadowsocks | +14%10,743 | +59%10,936 | +87%10,369 | −14%9,336 | +8%9,315 | +3%6,430 |
| VMess | −10%6,787 | +58%10,454 | ×2.49,312 | +6%6,030 | +7%7,875 | −5%5,237 |
| VLESS | +11%10,213 | +66%10,463 | ×2.69,907 | +93%5,921 | +18%7,549 | +29%5,467 |
| Trojan | +11%10,258 | +47%10,756 | +96%10,029 | −8%5,998 | +2%7,655 | −5%5,451 |
| AnyTLS | +25%8,390 | +46%10,338 | +74%9,559 | −6%8,397 | +4%8,464 | +6%6,137 |
| Hysteria 2 | +24%1,290 | +67%1,356 | +50%1,087 | +3%1,435 | +5%1,431 | ×2.71,276 |
| TUIC | +26%1,317 | +61%1,364 | +39%1,032 | −3%1,423 | +2%1,398 | +72%1,411 |
| WireGuard | +15%619 | +8%658 | +6%639 | +3%1,324 | +24%1,378 | +86%1,352 |
Every figure 60 tests × 3 clients
| Test | Pipe | Surge Mac | FlClash |
|---|---|---|---|
| Direct ↓ 1 | 13,805 | 6,960 | 10,505 |
| Direct ↑ 1 | 14,988 | 13,466 | 8,284 |
| Direct ↓ 8 | 10,279 | 6,625 | 7,888 |
| Direct ↑ 8 | 13,996 | 10,982 | 9,800 |
| Direct ↓ 64 | 8,780 | 5,606 | 6,229 |
| Direct ↑ 64 | 10,391 | 9,367 | 5,953 |
| SOCKS5 ↓ 1 | 11,131 | 6,073 | 10,441 |
| SOCKS5 ↑ 1 | 11,189 | 11,069 | 7,062 |
| SOCKS5 ↓ 8 | 11,354 | 5,858 | 7,313 |
| SOCKS5 ↑ 8 | 9,749 | 9,090 | 7,246 |
| SOCKS5 ↓ 64 | 10,561 | 5,101 | 5,296 |
| SOCKS5 ↑ 64 | 6,526 | 6,191 | 5,052 |
| Shadowsocks ↓ 1 | 10,743 | 6,126 | 9,394 |
| Shadowsocks ↑ 1 | 9,336 | 10,862 | 5,141 |
| Shadowsocks ↓ 8 | 10,936 | 5,753 | 6,897 |
| Shadowsocks ↑ 8 | 9,315 | 8,595 | 7,159 |
| Shadowsocks ↓ 64 | 10,369 | 5,533 | 5,247 |
| Shadowsocks ↑ 64 | 6,430 | 6,238 | 4,216 |
| VMess ↓ 1 | 6,787 | 6,041 | 7,523 |
| VMess ↑ 1 | 6,030 | 5,664 | 1,414 |
| VMess ↓ 8 | 10,454 | 5,672 | 6,599 |
| VMess ↑ 8 | 7,875 | 7,371 | 6,641 |
| VMess ↓ 64 | 9,312 | failed | 3,845 |
| VMess ↑ 64 | 5,237 | 5,535 | 4,225 |
| VLESS ↓ 1 | 10,213 | — | 9,175 |
| VLESS ↑ 1 | 5,921 | — | 3,065 |
| VLESS ↓ 8 | 10,463 | — | 6,311 |
| VLESS ↑ 8 | 7,549 | — | 6,374 |
| VLESS ↓ 64 | 9,907 | — | 3,747 |
| VLESS ↑ 64 | 5,467 | — | 4,232 |
| Trojan ↓ 1 | 10,258 | 5,935 | 9,221 |
| Trojan ↑ 1 | 5,998 | 6,499 | 3,140 |
| Trojan ↓ 8 | 10,756 | 5,707 | 7,327 |
| Trojan ↑ 8 | 7,655 | 7,499 | 6,388 |
| Trojan ↓ 64 | 10,029 | failed | 5,127 |
| Trojan ↑ 64 | 5,451 | 5,726 | 4,135 |
| AnyTLS ↓ 1 | 8,390 | 5,860 | 6,698 |
| AnyTLS ↑ 1 | 8,397 | 8,929 | 1,639 |
| AnyTLS ↓ 8 | 10,338 | 4,741 | 7,086 |
| AnyTLS ↑ 8 | 8,464 | 8,120 | 7,355 |
| AnyTLS ↓ 64 | 9,559 | failed | 5,503 |
| AnyTLS ↑ 64 | 6,137 | 5,791 | 5,261 |
| Hysteria 2 ↓ 1 | 1,290 | 1,042 | 794 |
| Hysteria 2 ↑ 1 | 1,435 | 1,388 | 296 |
| Hysteria 2 ↓ 8 | 1,356 | 814 | 813 |
| Hysteria 2 ↑ 8 | 1,431 | 1,360 | 470 |
| Hysteria 2 ↓ 64 | 1,087 | 417 | 725 |
| Hysteria 2 ↑ 64 | 1,276 | failed | 477 |
| TUIC ↓ 1 | 1,317 | 1,044 | 868 |
| TUIC ↑ 1 | 1,423 | 1,466 | 298 |
| TUIC ↓ 8 | 1,364 | 848 | 811 |
| TUIC ↑ 8 | 1,398 | 1,365 | 446 |
| TUIC ↓ 64 | 1,032 | 399 | 745 |
| TUIC ↑ 64 | 1,411 | failed | 820 |
| WireGuard ↓ 1 | 619 | failed | 539 |
| WireGuard ↑ 1 | 1,324 | failed | 1,283 |
| WireGuard ↓ 8 | 658 | failed | 609 |
| WireGuard ↑ 8 | 1,378 | failed | 1,111 |
| WireGuard ↓ 64 | 639 | failed | 605 |
| WireGuard ↑ 64 | 1,352 | failed | 725 |
Galaxy S25 Edge, Android 17 · USB cable to a Mac
Android app
The link here is adb over the cable, which carries some 2 to 2.8 Gbit/s of TCP and nothing else: most tests reach it, so throughput often says only “not slower”. What the phone spends is what ranks, and there no test is close.
- Pipe aa6b8acf
- FlClash 0.9.3
- Surfboard 2.35.2
Throughput
33/36
ahead or level
23 ahead10 level3 behind1.34× the best other client’s, as a geometric mean
CPU per gigabyte
36/36
ahead or level
36 ahead0 level0 behind4.45× less than the best other client, as a geometric mean
Memory
36/36
ahead or level
36 ahead0 level0 behind1.69× less than the best other client, as a geometric mean
Pipe spends 1.0 to 2.6 CPU seconds for each GiB, whatever the protocol. FlClash and Surfboard spend 2.8 to 34.6, and on Shadowsocks and VMess a single stream through either carries less than half of what Pipe does. Pipe’s processes hold 168 to 201 MiB; the others’ 236 to 523.
SOCKS5
Shadowsocks
VMess
VLESS
Trojan
AnyTLS
Every test
| Protocol | download, 1 stream | download, 8 streams | download, 64 streams | upload, 1 stream | upload, 8 streams | upload, 64 streams |
|---|---|---|---|---|---|---|
| SOCKS5 | −3%2,471 | +2%3,089 | −8%2,276 | +19%2,765 | +2%2,792 | +2%2,794 |
| Shadowsocks | ×2.52,590 | +10%2,795 | −28%1,858 | ×3.12,668 | +10%2,715 | +19%2,731 |
| VMess | ×4.62,454 | +12%2,649 | ×2.32,618 | ×2.32,055 | +11%2,687 | +17%2,696 |
| VLESS | +22%2,566 | +18%2,762 | ×2.22,779 | ×3.72,687 | +4%2,732 | +5%2,717 |
| Trojan | +15%2,574 | −9%2,765 | ×2.02,765 | +35%2,676 | +3%2,733 | +3%2,732 |
| AnyTLS | +3%2,606 | +1%3,071 | ×2.53,132 | +26%2,669 | +7%2,697 | +2%2,720 |
| Protocol | download, 1 stream | download, 8 streams | download, 64 streams | upload, 1 stream | upload, 8 streams | upload, 64 streams |
|---|---|---|---|---|---|---|
| SOCKS5 | −69%1.13 | −68%1.04 | −71%1.06 | −67%1.06 | −59%1.13 | −59%1.27 |
| Shadowsocks | −87%1.79 | −90%1.70 | −90%1.58 | −89%1.48 | −90%1.55 | −90%1.74 |
| VMess | −92%2.18 | −89%2.23 | −89%2.62 | −81%2.43 | −88%1.94 | −90%2.02 |
| VLESS | −70%1.69 | −70%1.92 | −70%1.87 | −80%1.49 | −68%1.56 | −66%1.66 |
| Trojan | −72%1.69 | −69%1.77 | −68%1.93 | −71%1.63 | −67%1.63 | −68%1.65 |
| AnyTLS | −67%2.15 | −59%2.12 | −62%2.31 | −71%1.57 | −69%1.62 | −67%1.74 |
Every figure 36 tests × 3 clients
| Test | Pipe | FlClash | Surfboard |
|---|---|---|---|
| SOCKS5 ↓ 1 | 2,471 | 2,550 | 2,427 |
| SOCKS5 ↑ 1 | 2,765 | 2,319 | 2,066 |
| SOCKS5 ↓ 8 | 3,089 | 3,031 | 2,971 |
| SOCKS5 ↑ 8 | 2,792 | 2,748 | 2,664 |
| SOCKS5 ↓ 64 | 2,276 | 2,474 | 1,380 |
| SOCKS5 ↑ 64 | 2,794 | 2,688 | 2,744 |
| Shadowsocks ↓ 1 | 2,590 | 648 | 1,040 |
| Shadowsocks ↑ 1 | 2,668 | 312 | 870 |
| Shadowsocks ↓ 8 | 2,795 | 2,392 | 2,530 |
| Shadowsocks ↑ 8 | 2,715 | 2,083 | 2,476 |
| Shadowsocks ↓ 64 | 1,858 | 1,040 | 2,571 |
| Shadowsocks ↑ 64 | 2,731 | 1,856 | 2,304 |
| VMess ↓ 1 | 2,454 | 524 | 536 |
| VMess ↑ 1 | 2,055 | 312 | 895 |
| VMess ↓ 8 | 2,649 | 2,371 | 1,655 |
| VMess ↑ 8 | 2,687 | 1,986 | 2,429 |
| VMess ↓ 64 | 2,618 | 697 | 1,157 |
| VMess ↑ 64 | 2,696 | 1,730 | 2,311 |
| VLESS ↓ 1 | 2,566 | 2,109 | — |
| VLESS ↑ 1 | 2,687 | 723 | — |
| VLESS ↓ 8 | 2,762 | 2,337 | — |
| VLESS ↑ 8 | 2,732 | 2,633 | — |
| VLESS ↓ 64 | 2,779 | 1,289 | — |
| VLESS ↑ 64 | 2,717 | 2,579 | — |
| Trojan ↓ 1 | 2,574 | 2,129 | 2,244 |
| Trojan ↑ 1 | 2,676 | 741 | 1,983 |
| Trojan ↓ 8 | 2,765 | 2,321 | 3,023 |
| Trojan ↑ 8 | 2,733 | 2,650 | 2,540 |
| Trojan ↓ 64 | 2,765 | 1,281 | 1,349 |
| Trojan ↑ 64 | 2,732 | 2,578 | 2,656 |
| AnyTLS ↓ 1 | 2,606 | 2,529 | 1,901 |
| AnyTLS ↑ 1 | 2,669 | 559 | 2,111 |
| AnyTLS ↓ 8 | 3,071 | 3,046 | 3,029 |
| AnyTLS ↑ 8 | 2,697 | 2,515 | 2,481 |
| AnyTLS ↓ 64 | 3,132 | 1,266 | 1,210 |
| AnyTLS ↑ 64 | 2,720 | 2,517 | 2,659 |
| Test | Pipe | FlClash | Surfboard |
|---|---|---|---|
| SOCKS5 ↓ 1 | 1.13 | 3.72 | 3.65 |
| SOCKS5 ↑ 1 | 1.06 | 3.45 | 3.21 |
| SOCKS5 ↓ 8 | 1.04 | 3.71 | 3.22 |
| SOCKS5 ↑ 8 | 1.13 | 3.12 | 2.78 |
| SOCKS5 ↓ 64 | 1.06 | 3.66 | 5.26 |
| SOCKS5 ↑ 64 | 1.27 | 3.11 | 3.86 |
| Shadowsocks ↓ 1 | 1.79 | 20.53 | 14.00 |
| Shadowsocks ↑ 1 | 1.48 | 25.92 | 13.45 |
| Shadowsocks ↓ 8 | 1.70 | 20.88 | 16.51 |
| Shadowsocks ↑ 8 | 1.55 | 26.13 | 15.42 |
| Shadowsocks ↓ 64 | 1.58 | 34.61 | 15.55 |
| Shadowsocks ↑ 64 | 1.74 | 24.42 | 16.60 |
| VMess ↓ 1 | 2.18 | 27.80 | 25.86 |
| VMess ↑ 1 | 2.43 | 26.22 | 13.10 |
| VMess ↓ 8 | 2.23 | 22.67 | 20.54 |
| VMess ↑ 8 | 1.94 | 25.89 | 16.65 |
| VMess ↓ 64 | 2.62 | 29.01 | 22.89 |
| VMess ↑ 64 | 2.02 | 29.35 | 19.59 |
| VLESS ↓ 1 | 1.69 | 5.65 | — |
| VLESS ↑ 1 | 1.49 | 7.31 | — |
| VLESS ↓ 8 | 1.92 | 6.30 | — |
| VLESS ↑ 8 | 1.56 | 4.95 | — |
| VLESS ↓ 64 | 1.87 | 6.20 | — |
| VLESS ↑ 64 | 1.66 | 4.92 | — |
| Trojan ↓ 1 | 1.69 | 5.98 | 8.56 |
| Trojan ↑ 1 | 1.63 | 7.21 | 5.67 |
| Trojan ↓ 8 | 1.77 | 5.78 | 7.31 |
| Trojan ↑ 8 | 1.63 | 5.00 | 4.94 |
| Trojan ↓ 64 | 1.93 | 5.96 | 9.37 |
| Trojan ↑ 64 | 1.65 | 5.15 | 6.41 |
| AnyTLS ↓ 1 | 2.15 | 6.51 | 9.57 |
| AnyTLS ↑ 1 | 1.57 | 8.08 | 5.34 |
| AnyTLS ↓ 8 | 2.12 | 5.12 | 7.87 |
| AnyTLS ↑ 8 | 1.62 | 5.26 | 5.22 |
| AnyTLS ↓ 64 | 2.31 | 6.14 | 11.49 |
| AnyTLS ↑ 64 | 1.74 | 5.29 | 6.18 |
| Test | Pipe | FlClash | Surfboard |
|---|---|---|---|
| SOCKS5 ↓ 1 | 185 | 487 | 259 |
| SOCKS5 ↑ 1 | 201 | 453 | 244 |
| SOCKS5 ↓ 8 | 170 | 453 | 248 |
| SOCKS5 ↑ 8 | 178 | 454 | 236 |
| SOCKS5 ↓ 64 | 181 | 455 | 246 |
| SOCKS5 ↑ 64 | 177 | 521 | 276 |
| Shadowsocks ↓ 1 | 174 | 510 | 275 |
| Shadowsocks ↑ 1 | 176 | 522 | 268 |
| Shadowsocks ↓ 8 | 169 | 522 | 271 |
| Shadowsocks ↑ 8 | 168 | 522 | 274 |
| Shadowsocks ↓ 64 | 170 | 523 | 251 |
| Shadowsocks ↑ 64 | 179 | 498 | 254 |
| VMess ↓ 1 | 175 | 496 | 286 |
| VMess ↑ 1 | 171 | 498 | 293 |
| VMess ↓ 8 | 173 | 499 | 282 |
| VMess ↑ 8 | 177 | 499 | 284 |
| VMess ↓ 64 | 178 | 499 | 289 |
| VMess ↑ 64 | 193 | 493 | 293 |
| VLESS ↓ 1 | 175 | 492 | — |
| VLESS ↑ 1 | 177 | 494 | — |
| VLESS ↓ 8 | 180 | 494 | — |
| VLESS ↑ 8 | 183 | 494 | — |
| VLESS ↓ 64 | 171 | 495 | — |
| VLESS ↑ 64 | 181 | 490 | — |
| Trojan ↓ 1 | 180 | 493 | 284 |
| Trojan ↑ 1 | 183 | 491 | 288 |
| Trojan ↓ 8 | 173 | 491 | 290 |
| Trojan ↑ 8 | 172 | 491 | 293 |
| Trojan ↓ 64 | 173 | 492 | 284 |
| Trojan ↑ 64 | 187 | 496 | 279 |
| AnyTLS ↓ 1 | 175 | 502 | 273 |
| AnyTLS ↑ 1 | 176 | 497 | 276 |
| AnyTLS ↓ 8 | 178 | 497 | 279 |
| AnyTLS ↑ 8 | 181 | 497 | 281 |
| AnyTLS ↓ 64 | 185 | 498 | 273 |
| AnyTLS ↑ 64 | 193 | 506 | 270 |
iPhone 15 Pro, iOS 27.2 · USB cable to a Mac
iPhone app
The hardest rig to read. An iPhone gives a tunnel one small process and about 50 MiB, a single upload is one efficiency core for every client, and a phone that has warmed carries a third less than one that has rested. Each client had one pass.
- Pipe aa6b8acf
- Surge 6.100.0
- Clash 1.0.9
Throughput
38/54
ahead or level
27 ahead11 level16 behind1.12× the best other client’s, as a geometric mean
Against Surge, Pipe is ahead in most VMess, AnyTLS, Hysteria 2 and TUIC tests, ahead or level in five of six Trojan tests, split on SOCKS5, and under it in most Shadowsocks and VLESS tests. Against Clash it is ahead in every test both finished but WireGuard’s downloads, where it trails by about a tenth. Surge’s WireGuard did not finish a run, and Clash’s extension stopped at sixty-four VMess and VLESS streams, so its Trojan and AnyTLS tests could not be run.
Every test
| Protocol | download, 1 stream | download, 8 streams | download, 64 streams | upload, 1 stream | upload, 8 streams | upload, 64 streams |
|---|---|---|---|---|---|---|
| SOCKS5 | +1%5,486 | +6%6,139 | +6%5,203 | −6%1,795 | −5%4,285 | −2%3,360 |
| Shadowsocks | −5%4,396 | −9%3,648 | −5%2,907 | +2%1,776 | −4%2,498 | −7%2,463 |
| VMess | +21%3,655 | +14%3,884 | +22%3,460 | +14%1,852 | −18%2,232 | +1%2,357 |
| VLESS | +4%4,196 | −11%5,663 | −6%4,572 | −30%1,181 | −4%3,889 | −13%2,690 |
| Trojan | +10%3,919 | +3%4,029 | −9%3,124 | +11%1,807 | +5%2,799 | −2%2,466 |
| AnyTLS | +50%4,201 | +3%3,748 | +25%1,815 | +20%1,823 | +6%2,520 | +24%3,261 |
| Hysteria 2 | −9%1,308 | +9%1,277 | ×2.31,433 | +13%1,488 | +9%1,451 | +12%1,439 |
| TUIC | −5%1,296 | +41%1,410 | ×2.91,533 | +25%1,458 | +17%1,431 | +16%1,366 |
| WireGuard | −11%659 | −14%651 | −8%636 | +71%998 | ×2.01,061 | ×4.0970 |
Every figure 54 tests × 3 clients
| Test | Pipe | Surge | Clash |
|---|---|---|---|
| SOCKS5 ↓ 1 | 5,486 | 5,408 | 4,338 |
| SOCKS5 ↑ 1 | 1,795 | 1,915 | 1,453 |
| SOCKS5 ↓ 8 | 6,139 | 5,772 | 3,924 |
| SOCKS5 ↑ 8 | 4,285 | 4,520 | 1,347 |
| SOCKS5 ↓ 64 | 5,203 | 4,904 | 2,964 |
| SOCKS5 ↑ 64 | 3,360 | 3,428 | 253 |
| Shadowsocks ↓ 1 | 4,396 | 4,649 | 1,292 |
| Shadowsocks ↑ 1 | 1,776 | 1,743 | 1,348 |
| Shadowsocks ↓ 8 | 3,648 | 4,006 | 1,171 |
| Shadowsocks ↑ 8 | 2,498 | 2,594 | 1,257 |
| Shadowsocks ↓ 64 | 2,907 | 3,066 | 907 |
| Shadowsocks ↑ 64 | 2,463 | 2,644 | 251 |
| VMess ↓ 1 | 3,655 | 3,025 | 1,911 |
| VMess ↑ 1 | 1,852 | 1,630 | 869 |
| VMess ↓ 8 | 3,884 | 3,415 | 1,723 |
| VMess ↑ 8 | 2,232 | 2,725 | 742 |
| VMess ↓ 64 | 3,460 | 2,837 | failed |
| VMess ↑ 64 | 2,357 | 2,325 | failed |
| VLESS ↓ 1 | 4,196 | 4,033 | 2,068 |
| VLESS ↑ 1 | 1,181 | 1,682 | 959 |
| VLESS ↓ 8 | 5,663 | 6,338 | 1,946 |
| VLESS ↑ 8 | 3,889 | 4,049 | 729 |
| VLESS ↓ 64 | 4,572 | 4,879 | failed |
| VLESS ↑ 64 | 2,690 | 3,108 | failed |
| Trojan ↓ 1 | 3,919 | 3,575 | failed |
| Trojan ↑ 1 | 1,807 | 1,629 | failed |
| Trojan ↓ 8 | 4,029 | 3,908 | failed |
| Trojan ↑ 8 | 2,799 | 2,655 | failed |
| Trojan ↓ 64 | 3,124 | 3,442 | failed |
| Trojan ↑ 64 | 2,466 | 2,528 | failed |
| AnyTLS ↓ 1 | 4,201 | 2,801 | failed |
| AnyTLS ↑ 1 | 1,823 | 1,521 | failed |
| AnyTLS ↓ 8 | 3,748 | 3,647 | failed |
| AnyTLS ↑ 8 | 2,520 | 2,370 | failed |
| AnyTLS ↓ 64 | 1,815 | 1,451 | failed |
| AnyTLS ↑ 64 | 3,261 | 2,639 | failed |
| Hysteria 2 ↓ 1 | 1,308 | 1,440 | 291 |
| Hysteria 2 ↑ 1 | 1,488 | 1,316 | 166 |
| Hysteria 2 ↓ 8 | 1,277 | 1,169 | 289 |
| Hysteria 2 ↑ 8 | 1,451 | 1,334 | 174 |
| Hysteria 2 ↓ 64 | 1,433 | 611 | 255 |
| Hysteria 2 ↑ 64 | 1,439 | 1,288 | 173 |
| TUIC ↓ 1 | 1,296 | 1,364 | 311 |
| TUIC ↑ 1 | 1,458 | 1,169 | 188 |
| TUIC ↓ 8 | 1,410 | 1,002 | 288 |
| TUIC ↑ 8 | 1,431 | 1,219 | 190 |
| TUIC ↓ 64 | 1,533 | 524 | 262 |
| TUIC ↑ 64 | 1,366 | 1,179 | 188 |
| WireGuard ↓ 1 | 659 | failed | 744 |
| WireGuard ↑ 1 | 998 | failed | 582 |
| WireGuard ↓ 8 | 651 | failed | 753 |
| WireGuard ↑ 8 | 1,061 | failed | 522 |
| WireGuard ↓ 64 | 636 | failed | 690 |
| WireGuard ↑ 64 | 970 | failed | 240 |
Where Pipe trails
All 24 of them. Most are single ten-second readings, and on the phones a test moves by more than these margins between sittings. Each is on our list.
| Rig | Test | Pipe | Best other | Difference |
|---|---|---|---|---|
| Mac app | Shadowsocks ↑ 1 | 9,336 | 10,862 Surge Mac | −14% |
| Mac app | VMess ↓ 1 | 6,787 | 7,523 FlClash | −10% |
| Mac app | VMess ↑ 64 | 5,237 | 5,535 Surge Mac | −5% |
| Mac app | Trojan ↑ 1 | 5,998 | 6,499 Surge Mac | −8% |
| Mac app | AnyTLS ↑ 1 | 8,397 | 8,929 Surge Mac | −6% |
| Android app | SOCKS5 ↓ 64 | 2,276 | 2,474 FlClash | −8% |
| Android app | Shadowsocks ↓ 64 | 1,858 | 2,571 Surfboard | −28% |
| Android app | Trojan ↓ 8 | 2,765 | 3,023 Surfboard | −9% |
| iPhone app | SOCKS5 ↑ 1 | 1,795 | 1,915 Surge | −6% |
| iPhone app | SOCKS5 ↑ 8 | 4,285 | 4,520 Surge | −5% |
| iPhone app | Shadowsocks ↓ 1 | 4,396 | 4,649 Surge | −5% |
| iPhone app | Shadowsocks ↓ 8 | 3,648 | 4,006 Surge | −9% |
| iPhone app | Shadowsocks ↓ 64 | 2,907 | 3,066 Surge | −5% |
| iPhone app | Shadowsocks ↑ 64 | 2,463 | 2,644 Surge | −7% |
| iPhone app | VMess ↑ 8 | 2,232 | 2,725 Surge | −18% |
| iPhone app | VLESS ↑ 1 | 1,181 | 1,682 Surge | −30% |
| iPhone app | VLESS ↓ 8 | 5,663 | 6,338 Surge | −11% |
| iPhone app | VLESS ↓ 64 | 4,572 | 4,879 Surge | −6% |
| iPhone app | VLESS ↑ 64 | 2,690 | 3,108 Surge | −13% |
| iPhone app | Trojan ↓ 64 | 3,124 | 3,442 Surge | −9% |
| iPhone app | Hysteria 2 ↓ 1 | 1,308 | 1,440 Surge | −9% |
| iPhone app | WireGuard ↓ 1 | 659 | 744 Clash | −11% |
| iPhone app | WireGuard ↓ 8 | 651 | 753 Clash | −14% |
| iPhone app | WireGuard ↓ 64 | 636 | 690 Clash | −8% |
Beside throughput, the engine spends more CPU than sing-box on single-stream Shadowsocks, in both directions, and holds more memory than mihomo on sixty-four WireGuard uploads. Those three tests are in the engine’s maps above.
Why it is fast
Nothing here is a trick of the rig. Every slow test is traced to its cause, and most causes turn out to be small: what Pipe hands the other end, and what it does between bursts.
Whole pieces on the wire
A proxy server opens and forwards each chunk it is sent. Shadowsocks chunks, AnyTLS frames and TLS records now leave Pipe at the size that fills one, never as a full piece and a scrap, so the server does less work for every gigabyte.
Nothing shared on the fast path
No lock is taken for every packet, the memory budget is read without one, and each flow’s buffers stay with it until it has been quiet for ten milliseconds rather than being returned at every gap.
A TCP/IP stack of its own
The tunnel’s traffic meets a stack written for this job: windows sized to the device, acknowledgements batched, and packets read and written in bursts where the system allows it.
No runtime in the way
Rust compiles to the machine with no garbage collector, so there is no collection to pause for and no second heap to grow. The CPU a gigabyte costs is cipher and system calls, and little else.
Method
Four rules, and everything on this page follows from them.
- One instrument. Every throughput figure is an iperf3 run: TCP, ten seconds after two omitted, the receiver’s Mbit/s. The generator sits outside every client and is the same for all of them.
- Only the client changes. One pinned server (sing-box 1.14.4), one link, one list of tests. Each client runs as it ships, with its own defaults; none is tuned, and Pipe gets no switch the others lack.
- Everything is kept. Every run is a line in a log, failed ones too, and every figure, chart and table on this page is written from that log by a script. A client that does not carry a protocol leaves a dash; one that could not finish a test is marked failed.
- Losses are shown. A test Pipe loses stays in the tables and in the count.
The rigs
- The engine
- A MacBook Pro (M1 Max, macOS 27.2) alone, over loopback. Each engine is a process with a forwarded port; CPU seconds and peak memory are read from outside it.
- Mac app
- A macOS 27.2 virtual machine (10 cores) on that Mac, which is also the far end. The machine shares its host’s cores with the server, so these figures rank the apps and are not what a Mac of its own would reach.
- Android app
- A Galaxy S25 Edge on Android 17, cabled to the Mac, the link carried by adb. iperf3 runs on the phone under an app’s own identity, inside every client’s tunnel. CPU and memory are read from the phone.
- iPhone app
- An iPhone 15 Pro on iOS 27.2, cabled to the Mac. A small app of ours holding stock libiperf makes the load, the same binary for every client and outside all of them.
Read this before quoting a figure
- These are lab links, not the internet. They rank clients on one machine and are not the speed your connection will have.
- Most tests are one ten-second reading. On the phones a test can move by a third between sittings with heat alone, so a single close result means little; the pattern across a rig means more.
- Pipe is the build of 14 November 2026 named above; the apps carry these figures from the first release cut from it. The other clients are the versions named above, as their authors ship them. Clash on the iPhone is built from its public source with one change, which binds a proxy to the cable.
- Bulk throughput, and what it costs, is all that is measured here. Latency, battery life over a day and recovery after a network change are not.
- The other products’ names belong to their owners. Nothing here is endorsed by them, and every figure is our own measurement on our own rigs.