« プラグイン | メイン | クラスのロードが遅い »

2011年12月20日

吉里吉里Java:: KAG3 のコンパイル時間とバイトコード

    

オリジナル : KAG3 のスクリプト読み込みに 90ms、KAGMainWindow のコンストラクタに 55ms。
吉里吉里Java : KAG3 のスクリプト読み込みに 335ms、KAGMainWindow のコンストラクタに 633ms。
Java 版遅い。
コンパイル時間は最初計測した時、600ms強だったんだけど、System.gc をコンパイルごとに呼ぶのを止めたら倍くらいに早くなった。
強制的に GC を呼ぶのはよくタイミングを考えた方がいいか。

コンパイルが遅いのはある程度予想していた。
オリジナルは文字列のポインタを直接読んで字句抽出しているところを Java版では文字アクセスクラス経由で実装しているのでそこは少し遅いはず。
Java だと配列にしても範囲チェックが入ってしまうのもある。
ここはもっとダイレクトにアクセスするようにした方がいいかもしれないが、ネイティブに比べて 3.7倍程度で済んでいるので、それほどコンパイル遅いと言うことはない気もする。
後、構文解析器がオリジナルは bison なのに比べて。Java 版は再帰下降法で手書きされている。
昔に読んだ yacc の本では、yacc は手書きよりも少し効率が劣ると書いていたけど、今どうなんだろう?
flex は、手書きよりも効率の良いコードを出力するとその時でも書いてた。
ただ、私が書いたパーサーが早いかどうかはわからないが。

TJS2 のベンチマークでは、使用している PC に比べて Android は80倍くらい遅かったので、それをそのまま当てはめて考えると、コンパイルに 26秒もかかってしまう。
これはちょっと致命的。
ただ、KAG3 のコンパイルは別に実行時にやる必要はないので、バイトコードを入出力できるようにすれば、ここは極めて高速に処理できるようになるはず。

で、KAGMainWindow のコンストラクタ。
何でこんなに遅いのだろうか。
何が遅いのか調べて最適化しないまずい。
Window周りの設定は、Android だとほとんど無視というか、出来ないのでそこがネックになっているのなら、Android はそれほど遅くないことになりそうだけど、調べてみないことには何とも言えないな。
コンパイル時間はバイトコード使うことで大きく短縮できるが、KAGMainWindow のコンストラクタは地道に最適化しないとどうにもならない。



投稿者 Takenori : 2011年12月20日 18:42




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