ハイパフォーマンスASP.NETの夢
One ASP.NET Advent Calendarに乗っけるようなネタにはなってないので、とりあえずこっそり書き散らす。
いろんな実行環境、いろんなWebフレームワークでマイクロベンチマークをとってる「TechEmpower Framework Benchmarks」というのがあって、しばらく前からちょっと話題になってたみたいです。
測定用アプリはGitHubで公開してて、プルリクエストも受け付けてます。だもんで、「XXフレームワークがないぞ」とか「YYフレームワークの実力はこんなもんじゃねえ」とかいった人たちがどんどんコードを投げ込んでて、TechEmpowerの方でもときどきベンチマークを再測定しているのです。現在の最新は2013/10/31に測定された、Round 7です。
で、ASP.NET。まあ健闘してはいます。全体的に見ればそんなに悪くない。ただ、「シンプルなオブジェクトをJSONにシリアライズして返す」というベンチの結果を見ると、Javaのサーブレットが圧倒的。Responses/Secondのピーク値が、「aspnet」(これ、ASP.NET MVCをIIS上で動かしてるやつです)のざっと7.6倍。で、もっと軽く速くしようっていうので、各種HTTPモジュールを外して、シンプルなHTTPハンドラ(ashxですらない、つまり、SimpleHandlerFactoryも通さない)で実装したのが「aspnet-stripped」。こうすることで「aspnet」の2.1倍にはなったものの、まだまだ*1。
Javaのサーブレットはなんでそんなに高性能なんだろうと思ったんですが、最近のJavaアプリケーションサーバーのWebサーバー部分は高性能なんですね。GlassFishのコアであるGrizzlyや、もとJBoss AS、現WildFlyのコアであるUndertowは、非同期I/Oを使って実装されてるようです。どうも、そのあたりがJSONベンチにはうまくハマってて、すごい性能をたたき出しているみたいです。
で、ぼくらの(?) ASP.NET はどうすべえという話です(別に何も気にしなくていい、という意見もあろうかと思いますが、こんなに差がついてたら悔しいじゃん?)
試したいのは、非同期I/Oによるサーバでしょうかね。.NETにはFireflyというサーバ実装があります。KayakやManosはもうメンテされていないっぽいので、こっちのほうがいいのかなと思ったけど、こっちも最新コミットは9か月前ですね……
うーむ。これでがんばるのはしんどいのかな?
しばやんも記事を書いていましたが、Heliosを使って旧来のASP.NETスタックを使わなかったら、ちょう速かったよ、ただしセルフホスト、テメーはダメだなんてなベンチも出てることですし、IISを凌ぐ非同期I/OなWebサーバは難しいのかな?Edge.jsのほうがよかったりする?
……と、そこまで書いておきながら、まだ試してないんです。すみませんすみません。
(追記)
あ、ほんとだ……
「http-listener」(HTTP.sysのラッパーであるHttpListsnerクラスをシンプルに使うやつ、OWINですらない)がさすがに速いですね。でもこれもJSONシリアライザを変えたらもちょっと速くなりそうな気もする。