HTML5時代のJavaScriptとハッシュオブジェクトの苦悩
結果
LH-MAIN /tmp% node --version v0.6.13 LH-MAIN /tmp% node hash_depth.js { time: 1045, title: 'direct' } { time: 1155, title: 'array depth-1' } { time: 1503, title: 'array depth-2' } { time: 1636, title: 'array depth-3' } { time: 1905, title: 'array depth-4' } { time: 2106, title: 'array depth-5' }
ソース
var v = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.'; var a1 = [v], a2 = [[v]], a3 = [[[v]]], a4 = [[[[v]]]], a5 = [[[[[v]]]]]; var benchmark = function(f, title){ var a = new Date(); for(var n = 100*1000*1000; n; --n) f(); var b = new Date(); console.log( { time:b-a, title:title } ); }; benchmark( function(){ var a = v; }, 'direct' ); benchmark( function(){ var a = a1[0]; }, 'array depth-1'); benchmark( function(){ var a = a2[0][0]; }, 'array depth-2'); benchmark( function(){ var a = a3[0][0][0]; }, 'array depth-3'); benchmark( function(){ var a = a4[0][0][0][0]; }, 'array depth-4'); benchmark( function(){ var a = a5[0][0][0][0][0]; }, 'array depth-5');
何が言いたいのか?
やはりJavaScriptはECMA-262では限界を超えるコストが大きすぎる。ハッシュオブジェクトに関するコストが大きすぎる。つまり関数もそして高度に構造化されたオブジェクトの扱いも、だ。
— 伊藤 兎 (実際にんじん)さん (@USAGI_WRP) 4月 6, 2012
JavaScriptはハッシュオブジェクトを効率化し、関数のオーバーヘッドを減らし、高度に構造化されたオブジェクトのコストを減らせる様にしないとダメだ。何にダメかってこれからのHTML5時代の開発言語としては実行効率が悪すぎる;w;
— 伊藤 兎 (実際にんじん)さん (@USAGI_WRP) 4月 6, 2012
しかしDartはどうか、あれはまだ可能性はあるが…本当にDartは処理効率でもJavaScriptに対してアドバンテージのある実装をする気があるのか…。それが無ければ単にCやJavaの経験者にシンタックスが優しいだけのへたれ言語に終わってしまうだろう。
— 伊藤 兎 (実際にんじん)さん (@USAGI_WRP) 4月 6, 2012
そして、CやJavaの経験者はJavaScriptを上手く扱えないほどプログラミングに不慣れな訳は無い。プログラミング初心者のちょっと言語にしかならないとなればDartは流行らない。WebGLをぶん回すならDartじゃなくっちゃ!くらいの性能が欲しい。
— 伊藤 兎 (実際にんじん)さん (@USAGI_WRP) 4月 6, 2012
いやまあ、WebGLをぶん回すの自体はGPUですけど。言いたい事は伝わってると信じてまあそういう事にしとく。
— 伊藤 兎 (実際にんじん)さん (@USAGI_WRP) 4月 6, 2012
と、言う事です・x・
<追記>
- ちなみに、JavaScriptでは関数の実体も同様にハッシュオブジェクトを使っています。
- 関数呼び出し時にarguments.calleeとか使えますよね、あと仮引数未定義でもいいし…その辺もずぶずぶにハッシュオブジェクトで扱ってます。
- そもそも上記は連想配列たるハッシュオブジェクト(Object型)じゃなくてただの配列だろうって思う人はもうちょっとJavaScriptという言語について勉強してみましょう。