Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2010-11-28

XCLがSBCLより速いところ

| 23:24 | XCLがSBCLより速いところ - わだばLisperになる を含むブックマーク はてなブックマーク - XCLがSBCLより速いところ - わだばLisperになる

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

どうもそういう気がします。

以上、オチなし。