XCLがSBCLより速いところ — #:g1

Posted 2010-11-28 14:24:00 GMT

Common Lispの入門ページで、(Common)Lispが他の言語に比べて便利なところにbignum(多倍長整数)があり、特にユーザーが意識することなくそのまま大きな数を扱えるという例で、

(DEFUN ^^ (BASE POWER)
  (LOOP :REPEAT POWER
        :FOR X := (EXPT BASE BASE) :THEN (EXPT X BASE)
        :FINALLY (RETURN X)))

(integer-length (^^ 10 5)) ;=> 332193

こんな感じの例がありました。
SBCLだと思ったより時間がかかって、
(progn (^^ 10 6) nil)
;⇒ NIL
----------
Evaluation took:
  5.140 seconds of real time
  5.120000 seconds of total run time (5.120000 user, 0.000000 system)
  99.61% CPU
  12,305,748,798 processor cycles
  1,273,168 bytes consed

Intel(R) Core(TM)2 Duo CPU P8600 @ 2.40GHz

位の感じです。
他の処理系だとどうなのかなと思ってXCLで試してみると、
(time (progn (^^ 10 6) nil))
;⇒ NIL
----------
Execution took:
  0.122491002 seconds of real time
  0.119999997 seconds of user run time
  0.0 seconds of system run time
  2,687,456 bytes allocated
  0 cons cells
断然速い結果に。

もしや、GMPを使っている処理系が速いのかもしれないと思って試してみると、
;; ECL
> (time (progn (^^ 10 6) nil))

real time : 0.078 secs run time : 0.080 secs gc count : 2 times consed : 18454345 bytes NIL

;; scheme
(define (^^ base power)
  (let loop ((ntimes (- power 1))
             (x (expt base base)))
    (if (zero? ntimes)
        x
        (loop (- ntimes 1)
              (expt x base)))))
;; mosh (gmp)
(time (begin (^^ 10 6) #f))
;;0.23214101791381836 real 0.2 user 0.02 sys
#f
;; gosh
(time (begin (^^ 10 6) #f))
;(time (begin (^^ 10 6) #f))
; real  22.394
; user  22.320
; sys    0.000
#f
どうもそういう気がします。
以上、オチなし。

comments powered by Disqus