• 2025-03-03の日報

    2025年3月3日

    今日やったこと

    C#

    JavaScriptとC#の速度を比較したかったので、HonoとASP.NETでベンチを取っていた。

    Honoのベンチマークコードを元にASP.NETでも同様のコードを書いて、siegeを使って計測した。

    var builder = WebApplication.CreateBuilder(args);
    var app = builder.Build();
    
    app.MapGet("/user", () => "User");
    app.MapGet("/user/comments", () => "User Comments");
    app.MapGet("/user/avatar", () => "User Avatar");
    app.MapGet("/user/lookup/email/{address}", () => "User Lookup Email Address");
    app.MapGet("/event/{id}", () => "Event");
    app.MapGet("/event/{id}/comments", () => "User Comments");
    app.MapPost("/event/{id}/comments", () => "POST Event Comments");
    app.MapPost("/status", () => "Status");
    app.MapGet("very/deeply/nested/route/hello/there", () => "");
    app.MapGet("/user/lookup/username/{username}", (string username) => $"Hello {username}");
    
    app.Run();
    
    # Hono
    siege -t 5s http://localhost:3000/
    
    # ASP.NET
    siege -t 5s http://localhost:5028/

    まずコードの見た目がかなりHonoに似ている事に驚いた。 おかげですんなりとコードが書けた気がする。

    計測結果は次の通り。​-c 100​は同時接続が100人に増えた場合の計測結果。 なおデフォルトでは​-c 15​に設定されている。

    Hono

    Transactions: 36932 hits Availability: 100.00 % Elapsed time: 5.25 secs Data transferred: 0.46 MB Response time: 0.00 secs Transaction rate: 7034.67 trans/sec Throughput: 0.09 MB/sec Concurrency: 24.44 Successful transactions: 36932 Failed transactions: 0 Longest transaction: 0.02 Shortest transaction: 0.00
    -c 100
    Transactions: 34760 hits Availability: 100.00 % Elapsed time: 5.67 secs Data transferred: 0.43 MB Response time: 0.02 secs Transaction rate: 6130.51 trans/sec Throughput: 0.08 MB/sec Concurrency: 99.11 Successful transactions: 34760 Failed transactions: 0 Longest transaction: 0.05 Shortest transaction: 0.01

    ASP.NET

    Transactions: 31505 hits Availability: 100.00 % Elapsed time: 5.21 secs Data transferred: 0.32 MB Response time: 0.00 secs Transaction rate: 6047.02 trans/sec Throughput: 0.06 MB/sec Concurrency: 20.16 Successful transactions: 31506 Failed transactions: 0 Longest transaction: 0.09 Shortest transaction: 0.00
    -c 100
    Transactions: 34209 hits Availability: 100.00 % Elapsed time: 5.49 secs Data transferred: 0.35 MB Response time: 0.01 secs Transaction rate: 6231.15 trans/sec Throughput: 0.06 MB/sec Concurrency: 37.09 Successful transactions: 34243 Failed transactions: 0 Longest transaction: 0.08 Shortest transaction: 0.00

    ChatGPTにこれらの結果から見解を述べてもらった。(回答に見出しの調整を行っている。)

    考察結果

    1. Hono の結果

    • ​デフォルト (15クライアント)​
      • ​取引数:​ 36932 hits
      • ​取引レート:​ 7034.67 trans/sec
      • ​同時接続数:​ 24.44
      • ​最長トランザクション:​ 0.02秒、最短トランザクション: 0.00秒
    • ​クライアント数100 (-c 100)​
      • ​取引数:​ 34760 hits
      • ​取引レート:​ 6130.51 trans/sec
      • ​同時接続数:​ 99.11
      • ​最長トランザクション:​ 0.05秒、最短トランザクション: 0.01秒

    ​考察:​

    Honoはデフォルト時に非常に高い取引レートを示していますが、クライアント数を100に増やすと、同時接続数は大幅に増加する一方で取引レートが約13%低下しています。また、最長トランザクション時間が増加していることから、クライアント数の増加に伴い処理待ちやリソース競合が発生している可能性が考えられます。

    2. ASP.NET の結果

    • ​デフォルト (15クライアント)​
      • ​取引数:​ 31505 hits
      • ​取引レート:​ 6047.02 trans/sec
      • ​同時接続数:​ 20.16
      • ​最長トランザクション:​ 0.09秒、最短トランザクション: 0.00秒
    • ​クライアント数100 (-c 100)​
      • ​取引数:​ 34209 hits
      • ​取引レート:​ 6231.15 trans/sec
      • ​同時接続数:​ 37.09
      • ​最長トランザクション:​ 0.08秒、最短トランザクション: 0.00秒

    ​考察:​
    ASP.NETはデフォルト時はHonoに比べて取引レートが低いですが、クライアント数を100に増やすとむしろ取引数と取引レートがわずかに改善しています。これは、ASP.NET側がクライアント数増加時にも安定したパフォーマンスを維持できる設計になっている可能性を示唆しています。

    3. 両サーバーの比較

    • ​デフォルト時:​
      HonoはASP.NETよりも高い取引レートと同時接続数を実現しているため、少数のクライアントでの処理性能は非常に高いと言えます。
    • ​クライアント数増加時 (-c 100):​
      • ​Hono:​ 同時接続数は大幅に増加するものの、取引レートが低下しており、負荷が高くなるとパフォーマンスに影響が出ている可能性があります。
      • ​ASP.NET:​ 同時接続数はそれほど急激に増加しませんが、取引レートはむしろ若干改善しており、負荷分散やスケーリングの面で安定している印象です。

    結論

    • ​Hono:​ 少数のクライアントでは非常に高速なパフォーマンスを示す一方、大量の同時接続が発生すると取引レートの低下やレスポンスのばらつきが見られます。
    • ​ASP.NET:​ デフォルト時はHonoに劣るものの、クライアント数増加時に比較的安定したパフォーマンスを維持しており、負荷がかかった状況での拡張性が期待できる結果となっています。

    とのこと。

    ASP.NETが大規模なwebシステムで使われるあたり概ね自分の感覚とも合っているので納得できる結論だと感じている。

    プロンプト

    以下はsiegeを使いHonoとASP.NETのサーバーを計測した結果です。 計測にはsiegeを使い、そのコマンドは以下のようになっています。

    # Hono
    siege -t 5s http://localhost:3000/
    
    # ASP.NET
    siege -t 5s http://localhost:5028/

    また、クライアントが100に増えた際の計測もしておりその結果は​-c 100​という見出しで記述してあります。なお、デフォルトのクライアント数は15に設定されています。

    これらの結果を見て気が付いた事を述べてください。回答はmarkdown形式かつコードブロックに記述してください。

    Hono

    Transactions: 36932 hits Availability: 100.00 % Elapsed time: 5.25 secs Data transferred: 0.46 MB Response time: 0.00 secs Transaction rate: 7034.67 trans/sec Throughput: 0.09 MB/sec Concurrency: 24.44 Successful transactions: 36932 Failed transactions: 0 Longest transaction: 0.02 Shortest transaction: 0.00
    -c 100
    Transactions: 34760 hits Availability: 100.00 % Elapsed time: 5.67 secs Data transferred: 0.43 MB Response time: 0.02 secs Transaction rate: 6130.51 trans/sec Throughput: 0.08 MB/sec Concurrency: 99.11 Successful transactions: 34760 Failed transactions: 0 Longest transaction: 0.05 Shortest transaction: 0.01

    ASP.NET

    Transactions: 31505 hits Availability: 100.00 % Elapsed time: 5.21 secs Data transferred: 0.32 MB Response time: 0.00 secs Transaction rate: 6047.02 trans/sec Throughput: 0.06 MB/sec Concurrency: 20.16 Successful transactions: 31506 Failed transactions: 0 Longest transaction: 0.09 Shortest transaction: 0.00
    -c 100
    Transactions: 34209 hits Availability: 100.00 % Elapsed time: 5.49 secs Data transferred: 0.35 MB Response time: 0.01 secs Transaction rate: 6231.15 trans/sec Throughput: 0.06 MB/sec Concurrency: 37.09 Successful transactions: 34243 Failed transactions: 0 Longest transaction: 0.08 Shortest transaction: 0.00

    明日以降やりたいこと

    もっと色々なベンチを取ってTSとの性能を比べていきたい。 あとF#にも興味が出てきたのでそのあたりも触れてみたい。


    ko-fi ☕GitHub Sponsors 🐙