空想犬猫記

※当日記では、犬も猫も空想も扱っておりません。(旧・エト記)

etolisp 進捗 (32) 〜 GCの改良と高速化!

徒然なるままにetolispをいじってみた。そのむかし,etolispにGC(ガーベージコレクタ)を組み込むにあたってCodeProjectでたまたま見つけたサンプルコードを参考にしたのだが,思えばこれが悪い出発点だったのかもしれない(評価は4.5ポイントと高いが…)。

まず実装がそもそも遅い。このフレームワークの特徴は,gc_ptrという特定の型に依らないジェネリックなポインタ型を導入するところにある。しかしながら,Mark&Sweepの度にnodeの検索をsetを使って行っているのが致命的で,検索の領域を狭める工夫で,多少は高速化できるものの,やはり「検索」するのは圧倒的に不利。またクラスの静的なサイズを元にmarkを行っているところも,実用上かなりの制限となる。

これは,intやdoubleなどのあらゆる型を一般的にGC&gc_ptrで管理するためである。しかし実用上は組み込み型をGCで管理するケースはほぼないので,GCで管理するオブジェクトの基底クラスを定義してmarkingは仮想関数で的確に行う作戦に変更。

それに加えてシンボルの検索をmapからhash_mapに変更した。ただし文字列をキーにした場合場合に限っては,mapの方が高速なので,そっちを使っている。

今回は,これだけの変更。しかもガベコレ周りの変更だけだったものの,処理速度が5倍くらい速くなった。いやー,スタート地点が低かったとはいえ,この高速化は嬉しい。