Tetsuya Okada
okaya****@c-cre*****
2002年 11月 18日 (月) 15:22:44 JST
はじめまして。岡田と申します。 1ヶ月ほど前から Gauche で遊んでいます。 継続を使ってバックトラックするプログラムを書いていまして、以下のような ベンチマークを作ったのですが Gauche 0.6.5 が segmentation fault してい まいます。RedHat Linux 7.2 と Windows XP SP1 Cygwin の両方で再現しまし た。Linux 用はバイナリの RPM を持ってきたもの。Cygwin のほうは自分で gcc 2.95.3 でコンパイルしたもの(gcc 3.2 だと uvector がエラーになるた め)です。 下から2行目の 10000 (繰り返し回数)を1にするとちゃんと動きます。 ちなみに他の処理系での結果は以下のような感じでした。(Athlon 1.2GHz) Chicken compiler (-O3): 0.09 秒 Chicken interpreter: 0.72 秒 SCM: 5.51 秒 guile: 38.38 秒 Petite Chez Scheme 0.29 秒 処理系によって、得手不得手が極端に現れますね。 ---------------------- cont-bench.scm (define *backtrack* '()) (define (choice s) (if (null? s) (fail) (if (call-with-current-continuation (lambda (cont) (set! *backtrack* (cons cont *backtrack*)) #t)) (car s) (choice (cdr s))))) ;; tail rec (define (fail) (let ((c (car *backtrack*))) (set! *backtrack* (cdr *backtrack*)) (c #f))) (define (cont-test) (let ((n 0)) (call-with-current-continuation (lambda (cont) (set! *backtrack* (list cont)) (let ((a (choice '("He" "She" "This"))) (b (choice '("boy" "girl" "pen")))) ;;(display (string-append a " is a " b ".")) ;;(newline) (set! n (+ n 1)) (fail)))) n)) (begin (write (do ((i 0 (+ i 1)) (n 0 (+ n (cont-test)))) ((>= i 10000) n))) (newline)) ---------------------- -- Tetsuya Okada Computer Creators, Inc.