ChezScheme

色々あってGaucheに依存しすぎなのもよくないという気がしたので、Petite ChezSchemeでも試して見る
http://www.scheme.com/petitechezscheme.html

無駄にスピード競争。その1。


(define (count n)
(if (= n 10000000)
n
(count (+ n 1))))

(time (count 0))

Gaucheが2.3秒くらいで、ChezSchemeが0.9秒くらい。


その2。こないだのフラッシュソートをChezSchemeで動くように変更。変更点。
・ChezSchemeは賢いので、x->integerでなく、roundでOK
・sort関数に、ちゃんと比較関数を引数として与える
・リストがどんだけ長くてもapplyできる


(define (fsort L)
(letrec
((partial-sort
(lambda (L m)
(let ( (vmin (apply min L))
(vmax (apply max L)) )
(if (= vmax vmin) #f
(let loop ((rest L) (v (make-vector m '())) (c (/ (- m 1) (- vmax vmin))))
(if (null? rest) v
(let ((k (round (* c (- (car rest) vmin)))))
(begin
(vector-set! v k (cons (car rest) (vector-ref v k)))
(loop (cdr rest) v c))))))))))
(cond
( (< (length L) 50) (sort < L) )
( (partial-sort L 50) => (lambda (x) (apply append (map fsort (vector->list x)))) )
( else L ))))

リスト長が100万とかでも、ちゃんと動くので、とりあえず、Gaucheに何か問題があったんでしょう。速度的には、Gaucheの倍くらい。Gaucheがリスト長1万ちょっと(10337以上)で落ちるので、その程度だと、GCが働かないので、あまり比較になってない気も

まとめ。Petite-ChezSchemeは、Gaucheの2倍くらい速くて、色々と安定してる気がする。流石20年の実績。Gaucheは結構細かいとこで色々罠が(2006/09/16追記:よく考えたら、高々1時間程度しか触ってないChezとそれより遥かに長い時間使ってるGaucheを比較して、こういうことを言うのはアンフェア)。けど、多分、日本語の処理とかは、やりづらいんだろうな。あと名前が長い。まあ、なんだかんだで、Gauche固有の機能使ってたりするし、ChezSchemeの方を、ぼちぼち触りながら様子を見よう