JavaScriptのparserに関する議論

1
Kazuho Oku @kazuho

@Constellation あざす。PIC を踏まえたコードって shape を変更しない、shape ができれば (v8用語で) monomorphic に、そうじゃなくとも polymorphic になるようにする、って以外にありますかね

2012-07-03 04:28:35
Kazuho Oku @kazuho

JSX はそういうコードを吐くように設計してる

2012-07-03 04:28:57
小倉唯 @Constellation

@kazuho property追加順番を同一にするとかですかね? transitionを適切にたどるために.

2012-07-03 04:29:25
Kazuho Oku @kazuho

__hot__ function とか書くと polymorphization が動くようにしてもいいと思ってるけど見対応

2012-07-03 04:29:36
Kazuho Oku @kazuho

@Constellation あ、なるほどです。それはできてるはず。あざす

2012-07-03 04:30:01
小倉唯 @Constellation

@kazuho あとはgetter/setterやattributionは使わない, arrayはdense状態を保ち, ArrayIndex以外のの名前のproperty追加を行わない, GC発生は極力抑える(Map cache flush対策)とか思いつく感じもします.

2012-07-03 04:32:54
Kazuho Oku @kazuho

@Constellation なるほどなるほど。Array に関していうと継承しても速度が落ちますね

2012-07-03 04:34:21
Kazuho Oku @kazuho

JSX にクラス定義を可能な場合 Array + static function としてコンパイルするブランチがあって、小規模なベンチマークだと実際高速になるんだけど box2d.jsx に適用すると遅くなるって問題があって、プロファイラ実装したのでベンチマークをとらないと、なう

2012-07-03 04:36:39
小倉唯 @Constellation

後property lookupより, heap variable lookupのほうが概して高速かと… offsetとか全部事前計算可能なので, JITで単純pointer lookup from memory, mov2つまで落ちる…

2012-07-03 04:37:14
Kazuho Oku @kazuho

@Constellation heap variable lookup ってローカル変数とかクロージャのローカル変数とか?

2012-07-03 04:38:22
小倉唯 @Constellation

@kazuho クロージャのローカル変数ですねー.

2012-07-03 04:38:41
Kazuho Oku @kazuho

@Constellation 効きますねー。てか property lookup は遅い。JSX は今は Array#length しかプロパティのキャッシュいれてないけど、まじめに aliasing の解析入れてローカル変数にキャッシュしたいですねー

2012-07-03 04:40:01
Kazuho Oku @kazuho

POD な object を tuple に変えるとかも効果ありそうだけどまだよく考えられてない

2012-07-03 04:43:10
小倉唯 @Constellation

@kazuho 是非お聞きしてみたかったのですがArray#length cacheはどのくらい効きます?みなさんlength用instrもっててICかかるはずでmap check&field mov, type infer効けば同一registerまで来るかと思っていたのですが

2012-07-03 04:44:36
Kazuho Oku @kazuho

@Constellation 毎回 type check かかった気がしますが、ベンチとりなおしますね。結局は、ループ内の式が .length あるいはそのレシーバを変更する可能性をどこまで VM が静的解析できるかって程度問題だと思います

2012-07-03 04:55:31
小倉唯 @Constellation

@kazuho なるほど! ありがとうございますー. 毎回type checkかかるとすればescapeしないとして, その分高速になるのでしょうか.

2012-07-03 04:58:15
Kazuho Oku @kazuho

いやらしいケースでいうと var a = []; a.push(a); for (var i = 0; i < a.length; ++i) a[i][1] = 1; みたいな aliasing もあるので

2012-07-03 05:00:19
小倉唯 @Constellation

@kazuho おおー, ありがとうございます! なるほど, 変わりますねー.

2012-07-03 05:10:25