« 保守サポート | メイン | TJS2 ドキュメントジェネレータ その3 »

2014年07月23日

1時間コーディング/吉里吉里Z 開発:: 部分的に1バイト文字にして速くなるか?

    

Slimmer and faster JavaScript strings in Firefox

これを読んで TJS2 でも同じように ASCII 文字列で格納すれば早くなるか試した。
結論を最初に言うとうまくいかなかったんだけど(部分的な変更では無理そう)。

TJS2 は文字列を tTJSVariantString で保持していて、21文字までなら固定長領域に格納される。
これを ASCII 文字列の場合は 43文字まで格納し、ASCII 文字列で比較すれば今までよりも長い文字列を固定長領域に保持でき、比較時も半分の長さを比較するだけで済む。
ハッシュの生成も半分のバイト長。
難点は、2バイト文字のポインタを得たい時には2バイト文字への変換とメモリ確保が発生してしまうこと。
で、この処理がキャストのオーバーロードで実装されていて、色々と使われている。
内部で文字列が tTJSVariantString で表されていればこの処理は使われることは少ない。
ただ、残念なことに tjs_char* で行われている処理が多い。
TJS2 の各種メンバアクセスのうち、PropSetByVS と言うメソッドだけが tTJSVariantString を使って検索していて、他のメソッドは tjs_char* で検索を行う。
だから、ASCII 文字列で保持しても出番が少ない。
全メソッドに ByVS 版を追加するとインターフェイスが変わってしまうし、量がある。
つまり、部分的な変更ではダメっぽい。

TJS2 は以下のような実装になっている。
文字列は全体で保持しているものがあり、同じ文字列の場合はだいたい共通のポインタを指すような実装になっているから、tjs_char* での文字列比較と言っても、一致するのならポインタ比較ですぐに終わる。
ポインタが一致しない場合は、文字列比較になる。
ASCII 文字列で格納するのはもうちょっと考えないとダメっぽい。

今回 tTJSVariantString の ASCII 文字列格納の実装に 1.5 時間くらいかかった。
ちゃんと動くようにもなったんだけど、速くならなかった。
理由は上述の通り。



投稿者 Takenori : 2014年07月23日 03:33




comments powered by Disqus
Total : Today : Yesterday : なかのひと