you21979の日記

実験ネタとか。仮想化とかnodejsで嵌った所とかおもしろかったところとかいろいろ

東京node学園祭2012参加してきました

東京node学園祭2012参加してきました

イントロダクション

基調講演
New Readable Stream in Node 0.10

Nodeコアの歩き方
~Nodeの開発に参加しよう~

Running Node.js in Production

layering distributed systems

ECMAScript tools - composable modules and transpiler infrastructure

 

全体として自分は英語のリスニングができないので通訳が大変よかったと感じました。

基調講演ではnode.js 1.0はもう少し先で0.10がもうすぐ出るとのこと。
自分は0.6をようやくアップデートして0.8を使うことにしたばかりなので
はやいなぁと。
package.jsonで依存関係ちゃんとやっとかないとまた動かなくなるのが出そう。
(NPMはnodeのバージョン関係なく最新版とってきてしまうので)
 
nodeコアの歩き方はドキュメントには書いてないnodeの仕組みでどこからみていったらよいかのとっかかりを紹介しいてた
自分もC++のソースは読んでいるがまだ全部把握してるわけじゃないので参考になった
大津さんの講演は前回のprocess.nextTickも大変参考になったし当分ウォッチさせていただこうと思っている。
 
Running Node.js in Productionはjitsuのceoの人でした
プロダクションレベルで運用するノウハウを講演してました
メモリリークは僕が前に書いたようにイベントリスナーには気をつけろとのことでした
npmのレプリケーションでプライベートnpmについても話していました
 
layering distributed systemsはsubstackの人で達人級の人が持ってる哲学をやってそうな人でした。
ストリームのプログラムをライブプログラミングでやってたのがとても印象的。
ゴシッププロトコルのところでチラチラ動かしてたMMOみたいなゲーム画面はどうなったんだろう
 
ECMAScript Toolsは自分も少し触ってみようかと思ったくらい面白そうでした

 

ECMAScriptがWEBのアセンブラのような位置づけになりそうです。

LLVM、CLRJVMECMAScriptサーバー/クライアント/OS問わず激しいシェア闘いがありそうな予感

 

あとで見てないセッションのUSTREAMの録画をみてみようとおもいます

 

Mikeal Rogersさんのやつがtweetみるとおもしろそうでした

 

http://www.ustream.tv/channel/nodefest2012a

 

node.jsのベンチマークいろいろ

githubにリポジトリ作った

https://github.com/you21979/nodejsbenchmark

 

・new Function

new Functionで動的にコード作るのたしかに早い。

evalはJIT効かないけどnew Functionは効いてる

requireが使えないけど。

 

mysql + ayncblock

mysqlでasyncblock使った場合の速度低下を調べた

使った場合と使わない場合の比較

 

・redis + asyncblock

redisでasyncblock使った場合の速度低下を調べた

使った場合と使わない場合の比較

 

 

freenas8.3

freenas8.3が気づけば出てたのでついでにVMWARE-ESXiの仮想化ドライバも入れた

mount -o rw /
mount -t cd9660 /dev/cd0 /media
cd /tmp
tar zxvf /media/vmware-freebsd-tools.tar.gz
cd vmware-tools-distrib
cp lib/modules/binary/FreeBSD8.1-amd64/*.ko /boot/modules
vi /boot/loader.conf
--------------------
vmxnet3_load="yes"
--------------------
reboot

これで準仮想化のvmxnet3が使える

最適化2

前回の最適化で気になったので調べてみた

http://you21979.hateblo.jp/entry/2012/10/19/143845

 

nodejsでswitch ~ case遅いとあったけど実際に試してみて5000超えたあたりから許容できないかもしれない

 

20000のenumを作ってcaseしまくってるのだが

https://github.com/you21979/nodejsbenchmark/blob/master/v8/bigswitchcase.js

switch文の上の方ほどはやく下のほうが遅い。キャッチできなくでも下のほうと同様に遅い。

switch1: 0ms

switch2: 3ms

switch3: 30ms

switch4: 89ms

switch5: 69ms

 

関数テーブルで実装したほうが早い

https://github.com/you21979/nodejsbenchmark/blob/master/v8/bigfunctable.js

switch1: 0ms

switch2: 0ms

switch3: 0ms

switch4: 1ms

switch5: 0ms

 

 

中身ジャンプテーブルに展開されないんかなぁ。

 

手で書いたswitch文は気にしなくてもいいがDSLなどから自動生成したdispatcherを扱う場合には気をつけたほうがいいかも。

node.jsの0.8系

そろそろ使っても大丈夫そうだろうか

やばそうなバグもだいぶ取れてるっぽいし(メモリリークとか)

0.6系のアップデートが12月までだしなぁ

 

起動管理ツールでforeverが使えないとやっぱきついなぁと思っていたのだが

最近qilinもよさそうに感じてる

最適化

↓の記事を読んで自分なりに解釈

https://github.com/felixge/faster-than-c

 

こんなかんじで最適化してるのか。DSLでソースコードジェネレートすればこういうのもありだな。オブジェクトを初期化時に項目を設定することが最適化につながるようだ

--

最適化前

var columns = [
    {name : 'end1'},
    {name : 'end2'},
    {name : 'end3'},
    {name : 'end4'},
    {name : 'end5'},
    {name : 'end6'},
    {name : 'end7'},
    {name : 'end8'},
    {name : 'end9'},
    {name : 'end'}
];
function parseRow(columns, parser) {
  var row = {};
  for (var i = 0; i < columns.length; i++) {
    row[columns[i].name] = parser.readColumnValue();
  }
  return row;
}

--

最適化後

function parseRow(parser) {
  return {
    "end1":parser.readColumnValue(),
    "end2":parser.readColumnValue(),
    "end3":parser.readColumnValue(),
    "end4":parser.readColumnValue(),
    "end5":parser.readColumnValue(),
    "end6":parser.readColumnValue(),
    "end7":parser.readColumnValue(),
    "end8":parser.readColumnValue(),
    "end9":parser.readColumnValue(),
    "end":parser.readColumnValue(),
  };
}

#new Functionってevalだと思うけど最適化とかJITかかるのか?

とおもったけど驚愕するようだから効くのだろう。。。

eval is awesome (when using its twin new Function(), eval() itself sucks)

 

#大きなswitch文はだめなのか?

自分はディスパッチャでswitch文使いまくってるが。。。

プログラム言語

自分はあまりプログラム言語にこだわりがなくて

いろんな言語をつまみ食いするのが好きで

邪道なことばかりやってる

 

C言語のマクロでパスカル書いたり(昔怒られた)

C言語のマクロとキャスト使ってOOやったり

javaプリプロセッサ使ってマクロ適用させたり(今はテンプレートあるからいらんかな)

オラクルで更新SQL糞遅いから俺俺KVS書いたり

LL言語ENUMないからDSLに書いて各言語用に定数や静的クラスで生成したり

LUAとかSquirrelならバインドがめんどくさいからIDL書けば自動でバインドルーチン生成するとか

ゲームシステム全般ならswitch - caseの嵐になるスキルシステムのディスパッチャとかDSLから自動生成するとか。

 

関数型言語はほとんど触ったことなくてまだ試行錯誤中

関数型は必須要素のJITとGCがJAVAによって進化したから最近目立つようになってきたのかな

関数型言語ってサーバプログラムととても相性がよい

haskellなんかももそっと早く動いてくれれば使いたい

 

#こだわりないとか書いたけどPHPは動的WEBページ作るのにはいいけど、脳が疲れるからサーバーアプリは書きたくない。。。

負荷が高い処理を他システム(他のサーバーアプリなど)で解決するしかないのはつらい