WasmerのWinterJSのベンチマーク結果はあやしい
「WinterJS 1.0」の記事がシェアされていたので読んでいたのだけど「Bunより速くなった」と書かれていたので何事と思ってチェックしてみた
ベンチマークの文書は以下に公開されている
で、まずエラーがめっちゃ出てる
Socket errors: connect 155, read 108, write 0, timeout 29
それはいいとして(よくないが)、肝心なところはJarred Sumnerも指摘しているけどwrk -t12 -c400でリクエストの並列処置性能を測っているというのに違和感がある
They’re benchmarking their HTTP server running on 12 cores compared to Bun running on 1 core
— Jarred Sumner (@jarredsumner) 2024年3月13日
winterjsサーバーはhyper(tokio)で書かれていてリクエストごとにマルチスレッドでコアを使ってSpiderMonkeyでスクリプトを実行してる
シングルスレッドなBunで条件を近づけるならreusePortオプションをLinuxで使ってマルチプロセスでBun.serve()するか、Workers APIを使うとかやりようはありそう
なのでWinterJSのサーバー実装だけマルチスレッドなので並列処置性能が高い(それはそう)という結果だと思った
「Webサーバとして処理速度が速い」と言えば間違ってはいないんだろうけど'Blazing fast speeds than Bun...'から想像する内容とはギャップがある
ただ私の環境(M1 Macbook Pro)では並列パラメータをいくら調整してもBunの方が速かったのだけど……
そしてwrk -t1 -c1にすると4倍Bunの方が秒間リクエストが出ていた。これは直感どうり
# WinterJS
❯ cargo run --release -- --version
winterjs 0.4.3
❯ cargo run --release -- ./simple.js
❯ wrk -t1 -c1 http://127.0.0.1:8080
Running 10s test @ http://127.0.0.1:8080
1 threads and 1 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 71.60us 212.70us 5.55ms 99.48%
Req/Sec 16.67k 0.92k 19.30k 81.94%
119422 requests in 10.03s, 13.67MB read
Requests/sec: 11910.93
Transfer/sec: 1.36MB
# Bun
❯ bun -v
1.0.31
❯ bun bun-simple.js
❯ wrk -t1 -c1 http://127.0.0.1:8080
Running 10s test @ http://127.0.0.1:8080
1 threads and 1 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 24.30us 49.42us 2.73ms 98.13%
Req/Sec 47.46k 2.00k 50.59k 85.15%
476904 requests in 10.10s, 54.58MB read
Requests/sec: 47221.50
Transfer/sec: 5.40MB
とはいえWinterJSのようなソフトウェアを作ってしまえるWasmerの人たちはすごいと思う
ただWasmer EdgeはWasmをデプロイするサービスだし、なぜかWinterJS自体をWasmにして動かそうとしていて、これを作った理由が謎だけど
Tips: ビルドエラーの解決
pythonバイナリのバージョンでwinterjsのビルドが失敗する時は以下で指定できる
❯ PYTHON3=/usr/bin/python3 cargo build -r
lldがないとビルドできない
❯ brew install llvm ❯ brew link -f llvm ❯ which lld /opt/homebrew/opt/llvm/bin/lld
追記
シングルスレッドなBunで条件を近づけるならreusePortオプションをLinuxで使ってマルチプロセスで
Bun.serve()するか
やりました