Node.js vs Play framework リベンジマッチ

このブログはPlay! framework Advent Calendar 2011 jp #play_ja : ATNDの19日目です。
それでいて、Node学園の発表ネタというわけで、一石二鳥を狙った内容になっています。
ただ、Node学園では発表に失敗したので、今回は伝えきれなかった部分をお伝えし、少しPlayよりに話を
してみたいかと思います。

Node vs Playベンチマーク


軽くおさらいします。

Node vs Play


@ikeike443 さんの記事でも紹介されていますが、
Nodejs vs Play for Front-End Appsという記事で、NodeとPlayのベンチマークが行われています。
そこでの結果は、下記の通り。
f:id:yosuke_furukawa:20111009003558p:image

Node 0.4.3 と Play 1.1.1 のベンチマーク結果として、レンダリングも含めて計測するとNodeの方が早い。
でもレンダリングなしで計測するとPlayの方が早いという結果でした。

レンダリングを行う場合、Groovyテンプレートエンジンが足を引っ張っており、速度が遅くなっているというお話でした。

現在


現在では、Nodeは0.6に安定版が出ており、マルチプロセスによるclusterなども出ています。
さらに、Playも1.2.4と2.0のBeta版が出ています。
Node学園では発表できませんでしたが、より高速なGroovy テンプレートもできています。
PlayFramework: New faster Groovy Template Engine | MoaxStuff
そんな訳で再ベンチマークしてみようと思ったのがきっかけです。

ベンチマーク


測定環境


Node学園の時と変わらず、Mac Book Airで測定しています。
CPU Intel Core i5 2core 64bit
Memory 4GB

測定ツール


JMeter 2.5.1
スレッド数 50
Ramp-up 期間 10 sec
10秒間の間に50回リクエストが来る想定です。

測定しているウェブサービス


ebayの商品検索サービスを測定しています。
f:id:yosuke_furukawa:20111219232613p:image
上の画像は"play framework"で検索した時の結果です。

以下の条件で検証しました。
・検索せず、toppageを表示するだけの時
・検索し、レンダリングする時
・検索した結果をfetchはするけど、レンダリングしない時

結果


検索して、レンダリングする場合、僅差(400msec程)ですが、Play 1.2.4 + non-blocking IOが一番早い結果になりました。
次点でPlay + faster groovy template、Node.js、Play 1.2.4 + blocking IO、 Play 2.0の順序でした。
Play 2.0は最下位になってしまいました。

検索せず、toppageを表示するだけの時はほとんど変わりません(それでもPlay 2.0は最下位ですが)。

検索した結果をfetchはするけど、レンダリングしない時はPlay 2.0が逆に最速、Play 1.2.4 + blocking IO以外はあまり変わらずといった
感じでした。

考察


Play 1.2.4ではGroovyってそこまで遅くない?
faster Groovy templateでも同じような速度なので、ある程度は高速化されているのかも。

1000リクエストを1秒間で処理できるかどうかもやってみましたが、Nodeはハングアップしてしまうのに対して、Playはある程度高速化された状態で
実現できました。ただし、Nodeは実行時、メモリは100MBも行くか行かないかなのに、Playは600MB~700MB消費してしまうので、メモリがシビアな
状況であればNodeの方がいいかも、という感じです。

Play の考察


ebayのシステムはJSON形式で返ってくるのですが、Groovyは確かに高速とは言えないので、
Play側には中間で処理するデータクラスのようなものがあったほうがもっと高速になると思います。

Play 2.0 ではJSON形式のオブジェクトの処理に時間がかかっているようなので、JSON形式のパースの標準化と
高速化が必要かと思いました。

次のバトン


もう少し書きたかったけど、タイムアップ。。。
次は@s_kozakeさんです。
ブログ:システムアーキテクトのごった煮