Let's start Scheme

2012-04-18

キャッシュの改善をしたい

前に書いたのだが、ちょっとソースを眺めなおした結果一筋縄ではいかなさそうだなぁと思い再びメモ。

とりあえず作成と読み込みのプロセスがある。っで、問題は作成時だと思われる。読み込みは単にタグみてオブジェクト作ってるだけなので。

【作成時のプロセス】
  1. コンパイルされたコードのスキャン
  2. スキャン時に検出できたライブラリの書き出し
  3. コード本体の書き出し
  4. マクロのスキャン
  5. マクロの書き出し
基本的にはスキャンと書き出しの2パスということになる。スキャンがある理由は共有構造の検出というのが主な理由になる。


改善における現状見えている問題はスキャンをどうするかということ。現状では対象になるのは、シンボル、文字列、キーワード、識別子、マクロ、ペア、ベクタとクロージャである。最初の3つを除いたものは、自身の中に共有構造を持つ可能性があるオブジェクトを持っている。たとえば、識別子はそれ自身の中に環境を保持しているが、その環境の中にはペアとかベクタが入ってくる。C側、Scheme側でそれぞれ問題が出てはくるのだが、C側の方が問題の解決は楽だろう。
現状Cで書かれているオブジェクトでキャッシュしたいものは、文字セット、正規表現と日付くらいか。特に正規表現はリーダーマクロが単にS式を返すので多少効率が悪い。これがキャッシュ可能になれば、読み込み時にオブジェクトをそのまま返すということができるようになるため、正規表現使用時のパフォーマンスがあがる(多分)。残りはdefine-constantでも使わない限りはあまり恩恵がない。(コンパイル時の畳み込みをキャッシュ不可能なオブジェクトは除外するように直さないとなぁ・・・)

とりあえずC側の改善を試みて、後にScheme側に取り掛かるべきだろうか・・・

あまり難しく考えなくても実装できてしまった・・・とりあえずC側だけだけど。

No comments:

Post a Comment