たごもりすメモ

コードとかその他の話とか。

node.js用のKyoto Tycoonクライアントライブラリ2種類を比較

アプリのデータ格納にKyoto Tycoonでも使うべ、と思って調べてみるとnode.js用には2種類のクライアントライブラリがあるようだ。

どちらも npm install kyoto-client および npm install kyoto-tycoon でインストールできる。

ざっと眺めてみると、APIはほとんど変わらない。というかコピペしてもほぼそのまま動くレベルで同じ(コンストラクタ・接続だけ違うけど)。あとデフォルト以外のDBを使おうとしたときにビミョーに指定方法が違う。そのくらい。kyoto-tycoonの方はJSDeferredが含まれていて最初から使用可能になっている。これが欲しい向きは kyoto-tycoon を選んでおくと良いかも。

性能面

じゃあ性能はどうなのよ、ということで簡単にset/append/getをやるスクリプトを書いてざっと試してみた。ユースケースは自分が書くアプリに合わせてあるのであんまり一般的ではない可能性が高いことに注意。スクリプト自体はgistに上げた。set/append/get performance test script of kyoto-client
処理内容は以下のような感じ。

  • serial_put_large:
    • 14bytesキー、33bytesデータのappend (file hash DB)
    • 14bytes(もしくはそれ以下)キー、33bytesデータのappend (file hash DB)
    • 40bytesキー、320bytesデータのset (file hash DB)
    • 32bytesキー、320,000bytesデータのset (directory hash DB)
    • 上記処理セットを順に144回
  • serial_put_big:
    • 14bytesキー、33bytesデータのappend (file hash DB)
    • 14bytes(もしくはそれ以下)キー、33bytesデータのappend (file hash DB)
    • 40bytesキー、320bytesデータのset (file hash DB)
    • 32bytesキー、320,000,000bytesデータのset (directory hash DB)
    • 上記処理セットを順に2回
  • get_random:
    • 14bytesキー、462bytesデータのget (file hash DB)
    • 40bytesキー、320bytesデータのget (file hash DB)
    • 上記処理セットを順に14400回
  • get_random_large:
    • 32bytesキー、320,000bytesデータのget (directory hash DB)
    • 上記処理を144回
  • get_random_big:
    • 32bytesキー、320,000,000bytesデータのget (directory hash DB)
    • 上記処理を1回

全ての処理が単独で走るように(並行処理が起きないように)してある。で、結果。(数値はすべて所要時間、ミリ秒)

tagomoris$ node kc_test.js ; echo "----------------"; node kt_test.js 
serial_put_large: 311
serial_put_big: 316513
get_random: 2263
get_random_large: 81
get_random_big: 206
----------------
serial_put_large: 2714
serial_put_big: 242581
get_random: 3260
get_random_large: 991
get_random_big: 2086
tagomoris$ 

手元端末でテキトーに実行しただけなので走らせるごとにいくらか数字が違ったが、まあ傾向としてはだいたいこんなもん。

テスト中の負荷はほとんどnodeのプロセスでかかってる(CPU99%以上)ので、差はほぼ純粋にクライアントライブラリの性能差だと言っていいと思う。極端に大きいデータのset時にだけ数値が逆転するが、あとは明確に kyoto-client の方が速い。こっちを選んでおけばいいかなーというところ。

……が、これから書くアプリは平常時負荷はゼロに等しく、たまーにやってくる巨大データの処理で破綻が起きないことの方が大事だったりする。うう、どっちにしようかな。