WasmerのWinterJSのベンチマーク結果はあやしい

「WinterJS 1.0」の記事がシェアされていたので読んでいたのだけど「Bunより速くなった」と書かれていたので何事と思ってチェックしてみた

wasmer.io

ベンチマークの文書は以下に公開されている

github.com

で、まずエラーがめっちゃ出てる

Socket errors: connect 155, read 108, write 0, timeout 29

それはいいとして(よくないが)、肝心なところはJarred Sumnerも指摘しているけどwrk -t12 -c400でリクエストの並列処置性能を測っているというのに違和感がある

winterjsサーバーはhyper(tokio)で書かれていてリクエストごとにマルチスレッドでコアを使ってSpiderMonkeyでスクリプトを実行してる

シングルスレッドなBunで条件を近づけるならreusePortオプションをLinuxで使ってマルチプロセスでBun.serve()するか、Workers APIを使うとかやりようはありそう

bun.sh

なので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()するか

やりました

zenn.dev