io.js がリリースされました

さてさて、io.js ver.1.0.0, 1.0.1 が無事アメリカ時間の1/13日に予告通りリリースされました。
リリースから数日経過して、現在はv1.0.3が出ています。

ある程度v1.0が安定してきた今、実際にNode.jsとどう違うのかを解説したいと思います。

Node.jsと機能的に違う所はどこか

前回の記事のio.jsについて知っていること - from scratchでも触れたんですが、一番大きな違いはv8が新しくなり、ES6の機能が増えました。

詳しくは公式のES6に関するページを読んでもらうとして、かいつまんで書いていきます。

ES6の機能に"shipping", "staged", "in_progress"の3段階のラベルがつくようになりました。

これはES6の機能の安定度合いを示していて、 "shipping" > "staged" > "in_progress" の順番で安定しています。in_progressにはまだ実装途中のものもあるので、これをONにするときは注意が必要です。

shippingの機能はデフォルトでONになっているため、以下の機能はharmonyフラグを付けずに利用可能です。

stagedの機能は今のところ以下の通りです。stagedの機能を使うにはes_stagingフラグを付けて実行してください。

お待ちかねのarrow_functionとかはまだin_progressです。個別に--harmony_arrow_functionsフラグを付けて実行してください。すこしハマりどころですが、harmonyオプションを付けてもすべての機能が有効になるわけではなく、stagedの機能までしか有効になりません。

node.js と io.js の性能差

io.jsが持っているbenchmarkスクリプトを実行しました。下記のような結果になっています。

httpの性能差

http.shのbenchmarkスクリプトを実行し、keepaliveありのReqs/secを計測しました。

node.js v0.10.35 node.js v0.11.15 io.js v1.0.3
17835.903 17115.2285 18916.817

f:id:yosuke_furukawa:20150123094138p:plain

見ての通り、v0.10.35からは6%ほど向上し、v0.11.15からは10%ほど向上しています。
これにはhttp-parserが最新になり、性能が向上している事が起因していると思われます。

Arrayの性能差

Arrayも同様にbenchmarkスクリプトを実行し、ops/secを計測しました。

f:id:yosuke_furukawa:20150123102604p:plain

こちらはv8のバージョンが上がっているため、配列操作も性能向上が見込まれます。ただし、TypedArrayやBufferに関しては性能低下の可能性報告されています。

現在、io.jsのbenchmarkスクリプトを修正して、node.jsとの差がどれ位あるのか検証中です。全ての検証が終わったらまたあとで報告します。

iojs インストール

現時点ではまだbrewrpmやapt-getには対応してません。入れる場合はソースから入れるかバイナリを取得して、パスが解決できる所に入れれば利用できます。

$ wget https://iojs.org/dist/latest/iojs-v1.0.3-darwin-x64.tar.gz
$ tar xvzf iojs-v1.0.3-darwin-x64.tar.gz
# iojs-v1.0.3-darwin-x64/bin の下にあるファイル(node iojs npm)をパス解決できる所に配置する

また既にnodeのバージョンマネージャで代表的な、nodebrew, nvm, naveといったマネージャはiojsのインストールに対応しています。
下記の要領で取得可能です。

# nodebrew
$ nodebrew install-binary io@latest
$ nodebrew use io@latest

# nvm
$ nvm install iojs
$ nvm use iojs

# nave
$ nave install latest
# nave だけはnode.jsと分けずにバージョンが存在したらiojsを優先的にgetしてくる
# node.jsとのバージョンが被ったらiojsを先に取るので常にiojsを優先するという強気
$ nave install v1.0.3

実際に使ってみる

実際に僕が作っているいくつかのソフトウェアで動かしてみると、expressもsocket.ioもgulpもさほど問題なく動作していました。試しにsocket.ioとexpressを使ったchatを作って動かしてみました。

http://iojschat.herokuapp.com/chat

※ ちなみに、enginesをiojsに指定すれば、herokuでも動かせます。

{
  "name": "socket-chat-example",
  "version": "0.0.1",
  "scripts": {
    "start": "node index.js"
  },
  "description": "my first socket.io app",
  "dependencies": {
    "express": "4.10.2",
    "socket.io": "1.2.0"
  },
  "engines": {
    "iojs": "1.0.x" // ここをiojsに変えるとherokuがiojsを使う
  }
}

ただいくら互換性を保っているとは言っても、いくつか動作しないライブラリも報告されています。

動かないライブラリがあったらここのissueに報告することになっているので、動かなければ報告してください。
SequelizeというORMが動かない事が僕の環境であったので、報告した所、Benから快く対応してもらいました。


EventEmitter gets TypeError if EventEmitter.prototype.addListener is called directly. · Issue #523 · iojs/io.js · GitHub

io.jsを使ってみたいと思っている方は試しに動作させて、動かなければ報告してください。僕もサポートします。

次回のnode学園ではio.jsの内容について話します

次回のnode学園ではio.jsについてお話します。io.jsができた経緯からio.jsの実際の性能、日本ユーザーグループでiojsをどう扱っていくかまで話をする予定ですので、ご興味があれば是非参加してください!!


東京Node学園 15時限目 - connpass