東京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
全体として自分は英語のリスニングができないので通訳が大変よかったと感じました。
ECMAScriptがWEBのアセンブラのような位置づけになりそうです。
LLVM、CLR、JVM、ECMAScriptサーバー/クライアント/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ページ作るのにはいいけど、脳が疲れるからサーバーアプリは書きたくない。。。
負荷が高い処理を他システム(他のサーバーアプリなど)で解決するしかないのはつらい