Open4

denoweb

インストール

環境
wsl2

dockerはポート合わせるのが面倒なので使わない
※書いとかないと忘れてうっかりdockerで試しそうなので

インストール

asdf plugin-add deno
asdf list all deno
asdf install deno 1.15.3
asdf global deno 1.15.3

main.ts

async function handle(conn: Deno.Conn) {
    const httpConn = Deno.serveHttp(conn);
    for await (const requestEvent of httpConn) {
        const url = new URL(requestEvent.request.url);
        console.log(`path: ${url.pathname}`);
        await requestEvent.respondWith(
            new Response("hello world", {
            status: 200,
            }),
        );
    }
}
 
const server = Deno.listen({ port:11111});
 
for await (const conn of server) {
    console.log('listen');
    handle(conn);
}

実行

deno run --allow-net main.ts

4000クライアント×10の40000リクエストを投げると、23000ぐらいで死ぬ
ab -n 40000 -c 4000 http://localhost:11111/

const server = Deno.listen({ port: 11111 });
 
let cnt=0;
 
while (true) {
  try {
    const conn = await server.accept();
    (async () => {
      const httpConn = Deno.serveHttp(conn);
      while (true) {
        try {
          const requestEvent = await httpConn.nextRequest();
          if(requestEvent === null){
            break;
          }
          const url = new URL(requestEvent.request.url);
          console.log(`path: ${url.pathname} : ${cnt++}`);
          await requestEvent.respondWith(
            new Response("hello world", {
            status: 200,
            }),
          );
 
        } catch (err) {
          // the connection has finished
          console.log("the connection has finished");
          break;
        }
      }
    })();
  } catch (err) {
    // The listener has closed
    console.log("The listener has closed")
    break;
  }
}

ab -n 40000 -c 4000 http://localhost:11111/
29000で死ぬ

速度比較

ab -n 40000 -c 4000

` deno go rust rust --release
real 17.90s 5.62s 36000requestで死ぬ 13.41
user 1.10s 0.52s なぜ 0.76s
sys 6.23s 3.82s なぜ 4.37s
  • rustは飛び飛びで1ヶ月ぐらいはやってるけど、まだよく分からない
  • goは公式見ながら数時間試しただけ
  • denoはjavascriptなので慣れたもん

※36000にしたら32400で死んだ
※32000にしたら28800で死んだ
なんで最後との一塊で死ぬのか謎

denoは素のDeno.listen
goはgin
rustはactix-web

ソースを貼り付けるのは面倒なので省略

  • deno
    は上に書いてあるwhileのコード
  • go
    公式にあるginのalbumsへのアクセス
  • rust
    自分のgithub参照(actix-webのテキトーなルーティング群のうちトップのみ)
    mutableな共有メモリ使ったりとか色々テストしてて無駄な処理突っ込んであるからか分からないが、糞遅い

dockerいらないと思ったけどそれだとrustのテストが面倒かったのでクロスコンパイル考えるならdocker載せた方が良い

crossはdocker入れないと動かなかった

windows上のdockerは不具合起こしやすいので軽く動作確認する時以外使いたくない

wsl2上でdocker使うなら最初からwsl2直でいいじゃん

ログインするとコメントできます