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 |

2009-11-26

KMRCLを眺める (23) time-seconds

| 23:26 | KMRCLを眺める (23) time-seconds - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める (23) time-seconds - わだばLisperになる

今日は、KMRCLのmacros.lispの中からTIME-SECONDSです。

定義は、こんな感じで、

(defmacro time-seconds (&body body)
  (let ((t1 (gensym)))
    `(let ((,t1 (get-internal-real-time)))
       (values
        (progn ,@body)
        (coerce (/ (- (get-internal-real-time) ,t1)
                   internal-time-units-per-second)
                'double-float)))))

BODYの結果と実行時間を多値で返してくれるというものみたいです。

(DEFUN FIB (N)
  (COND ((< N 2) N)
        ('T (+ (FIB (1- N))
               (FIB (- N 2))))))

(TIME-SECONDS 
  (FIB 40))
;=> 102334155
;   3.089d0

どういうときに使えるのかいまいち想像できず、絶対にやらなそうな例しか考えつきませんでした…。

;; FIB-AとFIB-Bの速度を比較して、速い方にFIBという名前をつける

(DEFUN FIB-A (N)
  (COND ((< N 2) N)
        ('T (+ (FIB (1- N))
               (FIB (- N 2))))))

(DEFUN FIB-B (N)
  (DECLARE (FIXNUM N))
  (COND ((< N 2) N)
        ('T (+ (FIB (1- N))
               (FIB (- N 2))))))

(SETF (SYMBOL-FUNCTION 'FIB)
      (LET ((VAL 40))
        (MULTIPLE-VALUE-BIND (A A-TIME) (TIME-SECONDS (FIB-A VAL))
          (MULTIPLE-VALUE-BIND (B B-TIME) (TIME-SECONDS (FIB-B VAL))
            (OR (= A B) (ERROR))
            (IF (< A-TIME B-TIME)
                #'FIB-A
                #'FIB-B)))))
;=> #<Function FIB-B>

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20091126