しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Nancy を使って JSON API を実装するメリット

Nancy ではてなブログ用の人気エントリー API を作ってみた - しばやん雑記 で Nancy を使って JSON(P) API を実装してみたので、今回は Nancy を使って開発するメリットを少しまとめておきます。

パフォーマンス

結論から先に書いておくと、Nancy と ASP.NET Web API のパフォーマンスを比較したところ、Nancy の方が ASP.NET Web API よりも最大で 2 倍近くのリクエストを処理出来ました。

使用したコードは以下のような感じです。純粋にフレームワークの性能を調べたいので、単純に JSON シリアライズを行うだけのコードです。

Nancy

using Nancy;

namespace NancyBenchmark
{
    public class MainModule : NancyModule
    {
        public MainModule()
        {
            Get["/"] = _ => Response.AsJson("Hello, world");
        }
    }
}

ASP.NET Web API

using System.Web.Http;

namespace WebApiBenchmark.Controllers
{
    public class ValuesController : ApiController
    {
        public string Get()
        {
            return "Hello, world";
        }
    }
}

aliostad/SuperBenchmarker · GitHub を使ってパフォーマンスを計測した結果が以下の表になります。10 回実行して、その平均を計算しました。

Nancy ASP.NET Web API
TPS 2481.8 1368.2
Max 17.293ms 17.84706ms
Min 0.23407ms 0.49706ms
Avg 1.0236285ms 1.87310648ms

Max が両者ともほぼ同じ値になっているのは ASP.NET のランタイム的な部分で時間がかかっているのかもしれません。初回のリクエストが終わった後は高速に実行されている感じがしました。*1

実際のところ、計測する前からわかっていましたが Web API は遅いです。しかし Nancy と Web API では機能が全然違うので、この結果だけで優劣を付けるのではなく、ケースバイケースで使い分けていくのが正解です。

JSONP への対応

先程の JSON API を JSONP API としても使いたい場合にはどうすればいいでしょうか?

実は ASP.NET Web API は JSONP には対応していないので、自前で JSONP を返す MediaTypeFormatter を作るぐらいしか方法がありません。しかし Nancy は Response.AsJson を使って JSON として返している場合、callback というクエリパラメータが付いていると自動的に JSONP として返してくれます。

例えば http://localhost/?callback=foobar といった形式でリクエストを投げると、以下のような JavaScript が出力されます。

foobar("Hello, world");

ASP.NET は何故か JSONP に MVC も Web API も対応していないので、何も考えずに JSONP に対応している Nancy はパフォーマンスも良くて使えそうですね。

*1:IIS Express なので多少挙動が変わるかも?