2011年08月22日

Erlangとは何だったのか

はてなブックマークに登録

タイトルは釣りです。 methane です。

8/20(土)にLL Planetesに行ってきました。 今年は JavaScript 一色と言っていいほど、 JavaScript の存在が大きくなっており、 そのなかでも特に Node.js の話題が多かったように思います。

「Node.jsとはなんだったのか」というセッションでは主にコールバックチェーン型プログラミング vs 軽量スレッドを使った手続き型プログラミングの話題や各言語におけるライブラリなどが 紹介されていたのですが、以前個人的な興味でいくつかの言語とライブラリで echo server を実装していたので、他にも興味を持っておられる方のために公開します。

いろんな言語でEcho Server@github

参考に、簡単なベンチマーク結果も載せておきます。各言語・フレームワークで完全に同じものを 実装しているわけではないし、エラー処理やバッファリングに違いがあるので、これが言語の速度 とは思わないでください。どの言語も1万req/secを超えているので、特にJITの無いCRubyやCPythonは 呼び出すメソッドの数が数個増えるだけでスコアが大きく変わります。 echo_in_many_languages
Google Docs Spreadsheet

この中でネイティブスレッドは C++ (thread版)で、言語内スレッドはGo, Erlang, geventで、 それ以外は基本的にイベント駆動になります。傾向としては、言語内スレッドを使う場合には イベント駆動に加えて言語内スレッドのオーバーヘッドが増える分だけ性能が落ちています。 しかし、どの言語+フレームワークでも1万req/secを超えており、通常はこの性能が アプリケーション上のボトルネックになることは無いでしょう。

感想ですが、ネットワークプログラミングのためのライブラリと純粋なイベント駆動ライブラリの 違いによってechoサーバーを実装する手軽さが大きく異なるのが印象的でした。 イベント駆動ライブラリを直接使う場合(pyev, libev, epoll)は「ソケットがreadable/writableになったら」 というレイヤからプログラムを書くのですが、Twisted, Node.js, gevent などネットワーク プログラミングをサポートしているライブラリだとソケットを直接扱う必要がなくなり、 実装に必要なコード量が大きく減ります。特に node.js はネットワークプログラミングに 特化していることもあり非常に簡単でした。

もうひとつ印象に残ったのが、PyPyの速度です。Tornado や Twisted はソケットを扱うレイヤから Pythonで実装されており、低レイヤがC++で実装されているEventMachineよりも遅いのですが、 PyPy-1.6 を使うと数割〜数倍高速化され、 PyPy 1.6 + Tornado は EventMachine を超えるところ までいきました。 JavaScriptエンジンの高速化競争が熱い昨今ですが PyPy も凄いです。


@methane

klab_gijutsu2 at 18:27│Comments(4)TrackBack(0)

トラックバックURL

この記事へのコメント

1. Posted by kosaki   2011年08月22日 19:55
本文にErlangが出て来てないぞー
2. Posted by Nicholas Piël   2011年08月22日 21:15
Hi,

The results are remarkable, actually they differ so much from what I would normally expect, that I highly doubt their validity.

After checking the client.c code, it seems to count all connections as successful irrespective of the actually reply (if any). I modified it a little bit and send you a pull request.

After running with the updated code, it actually shows gevent to be on par with Tornado (actually it is quite a bit faster).

Cheers,
Nicholas
3. Posted by methane   2011年08月24日 16:04
>kosaki さん
ベンチマークの結果、Erlangのスコアが思ったより振るわなかったので釣り餌に選んでました。
実はベンチマーク中ErlangだけがCPUを使い切れていなかったのですが、狙い通りErlangの人にコードの悪い点を指摘してもらえたので再ベンチしてみます。
4. Posted by methane   2011年08月24日 16:04
>Nicholas
I've merged your patch in github.
Thank you!

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
Blog内検索
Archives
このブログについて
DSASとは、KLab が構築し運用しているコンテンツサービス用のLinuxベースのインフラです。現在5ヶ所のデータセンタにて構築し、運用していますが、我々はDSASをより使いやすく、より安全に、そしてより省力で運用できることを目指して、日々改良に勤しんでいます。
このブログでは、そんな DSAS で使っている技術の紹介や、実験してみた結果の報告、トラブルに巻き込まれた時の経験談など、広く深く、色々な話題を織りまぜて紹介していきたいと思います。
最新コメント