GC 完成

もうチョイテストしなきゃならんが GC 完成。割と省メモリですんだと思う。GC の閾値を 0.3(low_water) と 0.6(high_water) にした。low_water を越したら同じメモリサイズで Copying GC。high_water をこしたら倍のメモリをとる。100% とになったら、ちょっとごまかす。ごまかし方は、同じサイズを alloc して連結する。次の gc のタイミングで 2のべき乗のサイズを(一応とっておかないと最悪はあふれ出すので)とって Copying GC。とりあえず SICP の wave2 は動作した。
f:id:ryos36:20091004223124g:image

いろいろためしていると compound_process でやたらと alloc していることに気がついた。理由は SICP の元のソースにある。例えば

(define (xcor-vect xy)
  (car xy))

xcor-vect は car なのだが、単純に compound_process にしてしまっているので処理が余計にかかっているというわけ。これを

(define xcor-vect car)

とすればだいぶ alloc に費やす処理を減らすことが出来る。までも lisp 的には

(declaim (inline xcor-vect))
(defun xcor-vect (xy) (car xy))

なんだろうが。自分で最適化するよりシステムが最適化してくれたほうがいいのは確か。