平々毎々(アーカイブ)

はてなダイアリーのアーカイブです。

ハイパフォーマンス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 MVCIIS上で動かしてるやつです)のざっと7.6倍。で、もっと軽く速くしようっていうので、各種HTTPモジュールを外して、シンプルなHTTPハンドラ(ashxですらない、つまり、SimpleHandlerFactoryも通さない)で実装したのが「aspnet-stripped」。こうすることで「aspnet」の2.1倍にはなったものの、まだまだ*1

http://www.techempower.com/benchmarks/#section=data-r7&hw=i7&test=json&f=1kw-13ydj4-q2w

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://www.techempower.com/benchmarks/#section=data-r7&hw=i7&test=json&f=1kw-13ydj4-ux4

http-listener」(HTTP.sysのラッパーであるHttpListsnerクラスをシンプルに使うやつ、OWINですらない)がさすがに速いですね。でもこれもJSONリアライザを変えたらもちょっと速くなりそうな気もする。

*1:JSONリアライザをJSON.NETに変えることでも速くなると思います