Pipe Get Pipe

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.

  • 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 behind

    1.27× the best other client’s, as a geometric mean

  • CPU per gigabyte

    52/54

    ahead or level

    49 ahead3 level2 behind

    1.74× less than the best other client, as a geometric mean

  • Memory

    53/54

    ahead or level

    51 ahead2 level1 behind

    2.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

    1. Pipe0.68
    2. sing-box1.30
    3. Xray1.53
    4. mihomo1.60
  • Shadowsocks

    1. Pipe1.03
    2. sing-box2.09
    3. Xray2.11
    4. mihomo2.22
  • VMess

    1. Pipe1.36
    2. sing-box1.97
    3. Xray1.69
    4. mihomo1.92
  • VLESS

    1. Pipe1.20
    2. sing-box2.12
    3. Xray2.11
    4. mihomo2.13
  • Trojan

    1. Pipe1.30
    2. sing-box1.96
    3. Xray2.33
    4. mihomo2.11
  • AnyTLS

    1. Pipe1.57
    2. sing-box2.55
    3. Xray—
    4. mihomo2.99
  • Hysteria 2

    1. Pipe6.11
    2. sing-box26.47
    3. Xray34.26
    4. mihomo33.67
  • TUIC

    1. Pipe5.68
    2. sing-box26.46
    3. Xray—
    4. mihomo33.97
  • WireGuard

    1. Pipe8.52
    2. sing-box51.46
    3. Xray64.40
    4. mihomo43.14
CPU seconds per GiB, eight downloads at once. Less is better; each chart has its own scale. A dash is a protocol the client does not carry.

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

    1. Pipe6
    2. sing-box26
    3. Xray17
    4. mihomo19
  • Shadowsocks

    1. Pipe8
    2. sing-box23
    3. Xray19
    4. mihomo40
  • VMess

    1. Pipe9
    2. sing-box22
    3. Xray21
    4. mihomo21
  • VLESS

    1. Pipe8
    2. sing-box22
    3. Xray19
    4. mihomo20
  • Trojan

    1. Pipe7
    2. sing-box21
    3. Xray19
    4. mihomo20
  • AnyTLS

    1. Pipe10
    2. sing-box23
    3. Xray—
    4. mihomo22
  • Hysteria 2

    1. Pipe7
    2. sing-box22
    3. Xray19
    4. mihomo21
  • TUIC

    1. Pipe7
    2. sing-box22
    3. Xray—
    4. mihomo20
  • WireGuard

    1. Pipe7
    2. sing-box120
    3. Xray30
    4. mihomo70
Peak memory in MiB, eight downloads at once. Less is better; each chart has its own scale.

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

    1. Pipe10,631
    2. sing-box6,522
    3. Xray6,581
    4. mihomo5,511
  • Shadowsocks

    1. Pipe9,074
    2. sing-box5,261
    3. Xray4,902
    4. mihomo5,958
  • VMess

    1. Pipe8,791
    2. sing-box5,570
    3. Xray6,942
    4. mihomo6,315
  • VLESS

    1. Pipe7,314
    2. sing-box5,148
    3. Xray4,629
    4. mihomo5,163
  • Trojan

    1. Pipe7,322
    2. sing-box5,121
    3. Xray4,603
    4. mihomo5,221
  • AnyTLS

    1. Pipe6,849
    2. sing-box5,182
    3. Xray—
    4. mihomo4,936
  • Hysteria 2

    1. Pipe1,266
    2. sing-box685
    3. Xray681
    4. mihomo684
  • TUIC

    1. Pipe1,329
    2. sing-box697
    3. Xray—
    4. mihomo674
  • WireGuard

    1. Pipe762
    2. sing-box489
    3. Xray427
    4. mihomo549
Throughput in Mbit/s, eight downloads at once. More is better; each chart has its own scale.

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

Throughput: Pipe against the best other client in each test (Mbit/s, more is better)
Protocoldownload, 1 streamdownload, 8 streamsdownload, 64 streamsupload, 1 streamupload, 8 streamsupload, 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
CPU per gigabyte: Pipe against the best other client in each test (CPU seconds per GiB, less is better)
Protocoldownload, 1 streamdownload, 8 streamsdownload, 64 streamsupload, 1 streamupload, 8 streamsupload, 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
Memory: Pipe against the best other client in each test (MiB, less is better)
Protocoldownload, 1 streamdownload, 8 streamsdownload, 64 streamsupload, 1 streamupload, 8 streamsupload, 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
Throughput (Mbit/s, more is better)
TestPipesing-boxXraymihomo
SOCKS5 ↓ 111,1947,68810,72610,200
SOCKS5 ↑ 19,9077,7139,4038,842
SOCKS5 ↓ 810,6316,5226,5815,511
SOCKS5 ↑ 89,7256,4766,7106,556
SOCKS5 ↓ 648,4327,8348,2338,087
SOCKS5 ↑ 648,4987,7058,0998,117
Shadowsocks ↓ 110,82210,77710,93911,182
Shadowsocks ↑ 110,6079,4506,9059,193
Shadowsocks ↓ 89,0745,2614,9025,958
Shadowsocks ↑ 89,0506,2225,2946,993
Shadowsocks ↓ 647,6867,8727,8117,639
Shadowsocks ↑ 647,7847,3256,1217,625
VMess ↓ 17,6037,8327,4007,818
VMess ↑ 18,5837,7544,9986,985
VMess ↓ 88,7915,5706,9426,315
VMess ↑ 88,5195,5784,7196,185
VMess ↓ 647,7366,6967,2077,207
VMess ↑ 647,8977,0796,0437,116
VLESS ↓ 17,6037,4526,7237,049
VLESS ↑ 18,5827,0017,2796,869
VLESS ↓ 87,3145,1484,6295,163
VLESS ↑ 86,9515,1244,8915,332
VLESS ↓ 647,5106,8256,3356,961
VLESS ↑ 647,7006,8406,2056,867
Trojan ↓ 17,5647,0236,7386,967
Trojan ↑ 18,6586,9266,8706,816
Trojan ↓ 87,3225,1214,6035,221
Trojan ↑ 87,0185,1224,9295,295
Trojan ↓ 647,4326,9296,5746,182
Trojan ↑ 647,6216,4776,3867,033
AnyTLS ↓ 16,5016,826—6,580
AnyTLS ↑ 111,6636,763—5,973
AnyTLS ↓ 86,8495,182—4,936
AnyTLS ↑ 88,1895,150—4,779
AnyTLS ↓ 647,1516,961—6,743
AnyTLS ↑ 647,7166,948—6,642
Hysteria 2 ↓ 11,2071,098983991
Hysteria 2 ↑ 11,9011,796716733
Hysteria 2 ↓ 81,266685681684
Hysteria 2 ↑ 81,847879620652
Hysteria 2 ↓ 64778674664670
Hysteria 2 ↑ 641,840742604624
TUIC ↓ 11,2171,135—999
TUIC ↑ 11,8841,836—732
TUIC ↓ 81,329697—674
TUIC ↑ 81,860852—659
TUIC ↓ 64914678—674
TUIC ↑ 641,853741—636
WireGuard ↓ 1764555507589
WireGuard ↑ 11,6731,2586261,500
WireGuard ↓ 8762489427549
WireGuard ↑ 81,4361,080499440
WireGuard ↓ 64690498failed552
WireGuard ↑ 641,4981,046495286
CPU per gigabyte (CPU seconds per GiB, less is better)
TestPipesing-boxXraymihomo
SOCKS5 ↓ 10.611.010.760.81
SOCKS5 ↑ 10.660.900.840.88
SOCKS5 ↓ 80.681.301.531.60
SOCKS5 ↑ 80.711.261.311.23
SOCKS5 ↓ 640.560.580.750.77
SOCKS5 ↑ 640.450.580.550.68
Shadowsocks ↓ 10.820.750.851.53
Shadowsocks ↑ 10.720.470.680.88
Shadowsocks ↓ 81.032.092.112.22
Shadowsocks ↑ 80.961.611.541.40
Shadowsocks ↓ 640.780.840.891.52
Shadowsocks ↑ 640.690.871.050.80
VMess ↓ 11.181.171.591.26
VMess ↑ 10.671.231.891.11
VMess ↓ 81.361.971.691.92
VMess ↑ 81.101.902.351.79
VMess ↓ 641.141.151.241.16
VMess ↑ 640.880.981.431.18
VLESS ↓ 11.081.271.311.26
VLESS ↑ 10.421.440.901.47
VLESS ↓ 81.202.122.112.13
VLESS ↑ 80.862.131.952.06
VLESS ↓ 640.971.131.191.07
VLESS ↑ 640.691.021.091.01
Trojan ↓ 11.081.261.321.26
Trojan ↑ 10.421.331.181.47
Trojan ↓ 81.301.962.332.11
Trojan ↑ 80.922.121.952.06
Trojan ↓ 640.961.081.191.23
Trojan ↑ 640.700.971.050.91
AnyTLS ↓ 11.551.71—1.82
AnyTLS ↑ 10.471.65—1.66
AnyTLS ↓ 81.572.55—2.99
AnyTLS ↑ 81.082.48—2.64
AnyTLS ↓ 641.101.54—1.78
AnyTLS ↑ 640.771.14—1.15
Hysteria 2 ↓ 16.6815.2023.5823.39
Hysteria 2 ↑ 15.497.9128.5627.60
Hysteria 2 ↓ 86.1126.4734.2633.67
Hysteria 2 ↑ 86.0410.4922.9822.14
Hysteria 2 ↓ 6414.7229.6935.0734.40
Hysteria 2 ↑ 645.719.5822.7519.89
TUIC ↓ 16.0716.11—25.17
TUIC ↑ 15.757.78—25.57
TUIC ↓ 85.6826.46—33.97
TUIC ↑ 85.9310.58—24.32
TUIC ↓ 6413.3529.40—31.51
TUIC ↑ 645.589.50—19.34
WireGuard ↓ 18.5941.3650.2539.56
WireGuard ↑ 15.5626.8532.1813.79
WireGuard ↓ 88.5251.4664.4043.14
WireGuard ↑ 86.4625.8047.5940.18
WireGuard ↓ 6412.9349.61failed49.14
WireGuard ↑ 645.9719.6237.2942.28
Memory (MiB, less is better)
TestPipesing-boxXraymihomo
SOCKS5 ↓ 15201619
SOCKS5 ↑ 15191618
SOCKS5 ↓ 86261719
SOCKS5 ↑ 86271819
SOCKS5 ↓ 6411662621
SOCKS5 ↑ 6411652822
Shadowsocks ↓ 15181721
Shadowsocks ↑ 15181617
Shadowsocks ↓ 88231940
Shadowsocks ↑ 87211918
Shadowsocks ↓ 6419324231
Shadowsocks ↑ 6420313423
VMess ↓ 16181819
VMess ↑ 16171819
VMess ↓ 89222121
VMess ↑ 89212021
VMess ↓ 6422353330
VMess ↑ 6427313534
VLESS ↓ 15181718
VLESS ↑ 16171719
VLESS ↓ 88221920
VLESS ↑ 88202020
VLESS ↓ 6420373330
VLESS ↑ 6418303328
Trojan ↓ 15191718
Trojan ↑ 16171718
Trojan ↓ 87211920
Trojan ↑ 88211920
Trojan ↓ 6418343230
Trojan ↑ 6419313430
AnyTLS ↓ 1619—19
AnyTLS ↑ 1518—18
AnyTLS ↓ 81023—22
AnyTLS ↑ 8925—23
AnyTLS ↓ 642444—38
AnyTLS ↑ 642442—38
Hysteria 2 ↓ 16211920
Hysteria 2 ↑ 19221919
Hysteria 2 ↓ 87221921
Hysteria 2 ↑ 813232021
Hysteria 2 ↓ 647302225
Hysteria 2 ↑ 6429362930
TUIC ↓ 1621—19
TUIC ↑ 11021—20
TUIC ↓ 8722—20
TUIC ↑ 81222—21
TUIC ↓ 64830—26
TUIC ↑ 643034—30
WireGuard ↓ 17562237
WireGuard ↑ 11215459213
WireGuard ↓ 871203070
WireGuard ↑ 86218215581
WireGuard ↓ 6412131failed81
WireGuard ↑ 6412133224198

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 behind

    1.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

    1. Pipe10,279
    2. Surge Mac6,625
    3. FlClash7,888
  • SOCKS5

    1. Pipe11,354
    2. Surge Mac5,858
    3. FlClash7,313
  • Shadowsocks

    1. Pipe10,936
    2. Surge Mac5,753
    3. FlClash6,897
  • VMess

    1. Pipe10,454
    2. Surge Mac5,672
    3. FlClash6,599
  • VLESS

    1. Pipe10,463
    2. Surge Mac—
    3. FlClash6,311
  • Trojan

    1. Pipe10,756
    2. Surge Mac5,707
    3. FlClash7,327
  • AnyTLS

    1. Pipe10,338
    2. Surge Mac4,741
    3. FlClash7,086
  • Hysteria 2

    1. Pipe1,356
    2. Surge Mac814
    3. FlClash813
  • TUIC

    1. Pipe1,364
    2. Surge Mac848
    3. FlClash811
  • WireGuard

    1. Pipe658
    2. Surge Macfailed
    3. FlClash609
Throughput in Mbit/s, eight downloads at once. More is better; each chart has its own scale.

Every test

Throughput: Pipe against the best other client in each test (Mbit/s, more is better)
Protocoldownload, 1 streamdownload, 8 streamsdownload, 64 streamsupload, 1 streamupload, 8 streamsupload, 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
Throughput (Mbit/s, more is better)
TestPipeSurge MacFlClash
Direct ↓ 113,8056,96010,505
Direct ↑ 114,98813,4668,284
Direct ↓ 810,2796,6257,888
Direct ↑ 813,99610,9829,800
Direct ↓ 648,7805,6066,229
Direct ↑ 6410,3919,3675,953
SOCKS5 ↓ 111,1316,07310,441
SOCKS5 ↑ 111,18911,0697,062
SOCKS5 ↓ 811,3545,8587,313
SOCKS5 ↑ 89,7499,0907,246
SOCKS5 ↓ 6410,5615,1015,296
SOCKS5 ↑ 646,5266,1915,052
Shadowsocks ↓ 110,7436,1269,394
Shadowsocks ↑ 19,33610,8625,141
Shadowsocks ↓ 810,9365,7536,897
Shadowsocks ↑ 89,3158,5957,159
Shadowsocks ↓ 6410,3695,5335,247
Shadowsocks ↑ 646,4306,2384,216
VMess ↓ 16,7876,0417,523
VMess ↑ 16,0305,6641,414
VMess ↓ 810,4545,6726,599
VMess ↑ 87,8757,3716,641
VMess ↓ 649,312failed3,845
VMess ↑ 645,2375,5354,225
VLESS ↓ 110,213—9,175
VLESS ↑ 15,921—3,065
VLESS ↓ 810,463—6,311
VLESS ↑ 87,549—6,374
VLESS ↓ 649,907—3,747
VLESS ↑ 645,467—4,232
Trojan ↓ 110,2585,9359,221
Trojan ↑ 15,9986,4993,140
Trojan ↓ 810,7565,7077,327
Trojan ↑ 87,6557,4996,388
Trojan ↓ 6410,029failed5,127
Trojan ↑ 645,4515,7264,135
AnyTLS ↓ 18,3905,8606,698
AnyTLS ↑ 18,3978,9291,639
AnyTLS ↓ 810,3384,7417,086
AnyTLS ↑ 88,4648,1207,355
AnyTLS ↓ 649,559failed5,503
AnyTLS ↑ 646,1375,7915,261
Hysteria 2 ↓ 11,2901,042794
Hysteria 2 ↑ 11,4351,388296
Hysteria 2 ↓ 81,356814813
Hysteria 2 ↑ 81,4311,360470
Hysteria 2 ↓ 641,087417725
Hysteria 2 ↑ 641,276failed477
TUIC ↓ 11,3171,044868
TUIC ↑ 11,4231,466298
TUIC ↓ 81,364848811
TUIC ↑ 81,3981,365446
TUIC ↓ 641,032399745
TUIC ↑ 641,411failed820
WireGuard ↓ 1619failed539
WireGuard ↑ 11,324failed1,283
WireGuard ↓ 8658failed609
WireGuard ↑ 81,378failed1,111
WireGuard ↓ 64639failed605
WireGuard ↑ 641,352failed725

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 behind

    1.34× the best other client’s, as a geometric mean

  • CPU per gigabyte

    36/36

    ahead or level

    36 ahead0 level0 behind

    4.45× less than the best other client, as a geometric mean

  • Memory

    36/36

    ahead or level

    36 ahead0 level0 behind

    1.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

    1. Pipe1.04
    2. FlClash3.71
    3. Surfboard3.22
  • Shadowsocks

    1. Pipe1.70
    2. FlClash20.88
    3. Surfboard16.51
  • VMess

    1. Pipe2.23
    2. FlClash22.67
    3. Surfboard20.54
  • VLESS

    1. Pipe1.92
    2. FlClash6.30
    3. Surfboard—
  • Trojan

    1. Pipe1.77
    2. FlClash5.78
    3. Surfboard7.31
  • AnyTLS

    1. Pipe2.12
    2. FlClash5.12
    3. Surfboard7.87
CPU seconds per GiB, eight downloads at once. Less is better; each chart has its own scale. Surfboard does not carry VLESS.

Every test

Throughput: Pipe against the best other client in each test (Mbit/s, more is better)
Protocoldownload, 1 streamdownload, 8 streamsdownload, 64 streamsupload, 1 streamupload, 8 streamsupload, 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
CPU per gigabyte: Pipe against the best other client in each test (CPU seconds per GiB, less is better)
Protocoldownload, 1 streamdownload, 8 streamsdownload, 64 streamsupload, 1 streamupload, 8 streamsupload, 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
Throughput (Mbit/s, more is better)
TestPipeFlClashSurfboard
SOCKS5 ↓ 12,4712,5502,427
SOCKS5 ↑ 12,7652,3192,066
SOCKS5 ↓ 83,0893,0312,971
SOCKS5 ↑ 82,7922,7482,664
SOCKS5 ↓ 642,2762,4741,380
SOCKS5 ↑ 642,7942,6882,744
Shadowsocks ↓ 12,5906481,040
Shadowsocks ↑ 12,668312870
Shadowsocks ↓ 82,7952,3922,530
Shadowsocks ↑ 82,7152,0832,476
Shadowsocks ↓ 641,8581,0402,571
Shadowsocks ↑ 642,7311,8562,304
VMess ↓ 12,454524536
VMess ↑ 12,055312895
VMess ↓ 82,6492,3711,655
VMess ↑ 82,6871,9862,429
VMess ↓ 642,6186971,157
VMess ↑ 642,6961,7302,311
VLESS ↓ 12,5662,109—
VLESS ↑ 12,687723—
VLESS ↓ 82,7622,337—
VLESS ↑ 82,7322,633—
VLESS ↓ 642,7791,289—
VLESS ↑ 642,7172,579—
Trojan ↓ 12,5742,1292,244
Trojan ↑ 12,6767411,983
Trojan ↓ 82,7652,3213,023
Trojan ↑ 82,7332,6502,540
Trojan ↓ 642,7651,2811,349
Trojan ↑ 642,7322,5782,656
AnyTLS ↓ 12,6062,5291,901
AnyTLS ↑ 12,6695592,111
AnyTLS ↓ 83,0713,0463,029
AnyTLS ↑ 82,6972,5152,481
AnyTLS ↓ 643,1321,2661,210
AnyTLS ↑ 642,7202,5172,659
CPU per gigabyte (CPU seconds per GiB, less is better)
TestPipeFlClashSurfboard
SOCKS5 ↓ 11.133.723.65
SOCKS5 ↑ 11.063.453.21
SOCKS5 ↓ 81.043.713.22
SOCKS5 ↑ 81.133.122.78
SOCKS5 ↓ 641.063.665.26
SOCKS5 ↑ 641.273.113.86
Shadowsocks ↓ 11.7920.5314.00
Shadowsocks ↑ 11.4825.9213.45
Shadowsocks ↓ 81.7020.8816.51
Shadowsocks ↑ 81.5526.1315.42
Shadowsocks ↓ 641.5834.6115.55
Shadowsocks ↑ 641.7424.4216.60
VMess ↓ 12.1827.8025.86
VMess ↑ 12.4326.2213.10
VMess ↓ 82.2322.6720.54
VMess ↑ 81.9425.8916.65
VMess ↓ 642.6229.0122.89
VMess ↑ 642.0229.3519.59
VLESS ↓ 11.695.65—
VLESS ↑ 11.497.31—
VLESS ↓ 81.926.30—
VLESS ↑ 81.564.95—
VLESS ↓ 641.876.20—
VLESS ↑ 641.664.92—
Trojan ↓ 11.695.988.56
Trojan ↑ 11.637.215.67
Trojan ↓ 81.775.787.31
Trojan ↑ 81.635.004.94
Trojan ↓ 641.935.969.37
Trojan ↑ 641.655.156.41
AnyTLS ↓ 12.156.519.57
AnyTLS ↑ 11.578.085.34
AnyTLS ↓ 82.125.127.87
AnyTLS ↑ 81.625.265.22
AnyTLS ↓ 642.316.1411.49
AnyTLS ↑ 641.745.296.18
Memory (MiB, less is better)
TestPipeFlClashSurfboard
SOCKS5 ↓ 1185487259
SOCKS5 ↑ 1201453244
SOCKS5 ↓ 8170453248
SOCKS5 ↑ 8178454236
SOCKS5 ↓ 64181455246
SOCKS5 ↑ 64177521276
Shadowsocks ↓ 1174510275
Shadowsocks ↑ 1176522268
Shadowsocks ↓ 8169522271
Shadowsocks ↑ 8168522274
Shadowsocks ↓ 64170523251
Shadowsocks ↑ 64179498254
VMess ↓ 1175496286
VMess ↑ 1171498293
VMess ↓ 8173499282
VMess ↑ 8177499284
VMess ↓ 64178499289
VMess ↑ 64193493293
VLESS ↓ 1175492—
VLESS ↑ 1177494—
VLESS ↓ 8180494—
VLESS ↑ 8183494—
VLESS ↓ 64171495—
VLESS ↑ 64181490—
Trojan ↓ 1180493284
Trojan ↑ 1183491288
Trojan ↓ 8173491290
Trojan ↑ 8172491293
Trojan ↓ 64173492284
Trojan ↑ 64187496279
AnyTLS ↓ 1175502273
AnyTLS ↑ 1176497276
AnyTLS ↓ 8178497279
AnyTLS ↑ 8181497281
AnyTLS ↓ 64185498273
AnyTLS ↑ 64193506270

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 behind

    1.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

Throughput: Pipe against the best other client in each test (Mbit/s, more is better)
Protocoldownload, 1 streamdownload, 8 streamsdownload, 64 streamsupload, 1 streamupload, 8 streamsupload, 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
Throughput (Mbit/s, more is better)
TestPipeSurgeClash
SOCKS5 ↓ 15,4865,4084,338
SOCKS5 ↑ 11,7951,9151,453
SOCKS5 ↓ 86,1395,7723,924
SOCKS5 ↑ 84,2854,5201,347
SOCKS5 ↓ 645,2034,9042,964
SOCKS5 ↑ 643,3603,428253
Shadowsocks ↓ 14,3964,6491,292
Shadowsocks ↑ 11,7761,7431,348
Shadowsocks ↓ 83,6484,0061,171
Shadowsocks ↑ 82,4982,5941,257
Shadowsocks ↓ 642,9073,066907
Shadowsocks ↑ 642,4632,644251
VMess ↓ 13,6553,0251,911
VMess ↑ 11,8521,630869
VMess ↓ 83,8843,4151,723
VMess ↑ 82,2322,725742
VMess ↓ 643,4602,837failed
VMess ↑ 642,3572,325failed
VLESS ↓ 14,1964,0332,068
VLESS ↑ 11,1811,682959
VLESS ↓ 85,6636,3381,946
VLESS ↑ 83,8894,049729
VLESS ↓ 644,5724,879failed
VLESS ↑ 642,6903,108failed
Trojan ↓ 13,9193,575failed
Trojan ↑ 11,8071,629failed
Trojan ↓ 84,0293,908failed
Trojan ↑ 82,7992,655failed
Trojan ↓ 643,1243,442failed
Trojan ↑ 642,4662,528failed
AnyTLS ↓ 14,2012,801failed
AnyTLS ↑ 11,8231,521failed
AnyTLS ↓ 83,7483,647failed
AnyTLS ↑ 82,5202,370failed
AnyTLS ↓ 641,8151,451failed
AnyTLS ↑ 643,2612,639failed
Hysteria 2 ↓ 11,3081,440291
Hysteria 2 ↑ 11,4881,316166
Hysteria 2 ↓ 81,2771,169289
Hysteria 2 ↑ 81,4511,334174
Hysteria 2 ↓ 641,433611255
Hysteria 2 ↑ 641,4391,288173
TUIC ↓ 11,2961,364311
TUIC ↑ 11,4581,169188
TUIC ↓ 81,4101,002288
TUIC ↑ 81,4311,219190
TUIC ↓ 641,533524262
TUIC ↑ 641,3661,179188
WireGuard ↓ 1659failed744
WireGuard ↑ 1998failed582
WireGuard ↓ 8651failed753
WireGuard ↑ 81,061failed522
WireGuard ↓ 64636failed690
WireGuard ↑ 64970failed240

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.

Every throughput test where Pipe is more than 5% under the best other client (Mbit/s)
RigTestPipeBest otherDifference
Mac appShadowsocks ↑ 19,33610,862 Surge Mac−14%
Mac appVMess ↓ 16,7877,523 FlClash−10%
Mac appVMess ↑ 645,2375,535 Surge Mac−5%
Mac appTrojan ↑ 15,9986,499 Surge Mac−8%
Mac appAnyTLS ↑ 18,3978,929 Surge Mac−6%
Android appSOCKS5 ↓ 642,2762,474 FlClash−8%
Android appShadowsocks ↓ 641,8582,571 Surfboard−28%
Android appTrojan ↓ 82,7653,023 Surfboard−9%
iPhone appSOCKS5 ↑ 11,7951,915 Surge−6%
iPhone appSOCKS5 ↑ 84,2854,520 Surge−5%
iPhone appShadowsocks ↓ 14,3964,649 Surge−5%
iPhone appShadowsocks ↓ 83,6484,006 Surge−9%
iPhone appShadowsocks ↓ 642,9073,066 Surge−5%
iPhone appShadowsocks ↑ 642,4632,644 Surge−7%
iPhone appVMess ↑ 82,2322,725 Surge−18%
iPhone appVLESS ↑ 11,1811,682 Surge−30%
iPhone appVLESS ↓ 85,6636,338 Surge−11%
iPhone appVLESS ↓ 644,5724,879 Surge−6%
iPhone appVLESS ↑ 642,6903,108 Surge−13%
iPhone appTrojan ↓ 643,1243,442 Surge−9%
iPhone appHysteria 2 ↓ 11,3081,440 Surge−9%
iPhone appWireGuard ↓ 1659744 Clash−11%
iPhone appWireGuard ↓ 8651753 Clash−14%
iPhone appWireGuard ↓ 64636690 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.

  1. 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.
  2. 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.
  3. 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.
  4. 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.