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-03-26

KMRCLを眺める(125) COUNT-STRING-CHAR-IF

| 13:31 | KMRCLを眺める(125) COUNT-STRING-CHAR-IF - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める(125) COUNT-STRING-CHAR-IF - わだばLisperになる

今回はKMRCLのstrings.lispから、COUNT-STRING-CHAR-IFです。

動作は、

(KL:COUNT-STRING-CHAR-IF (LAMBDA (C) (CHAR= #\o C)) "fooooooooooooo")
⇒ 13

というところで、CLの標準に準備されている関数でいえば、COUNT-IFの動きです。

定義は、

(defun count-string-char-if (pred s)
  "Return a count of the number of times a predicate is true
for characters in a string"
  (declare (simple-string s)
           (type (or function symbol) pred)
           (optimize (speed 3) (safety 0) (space 0)))
  (do ((len (length s))
       (i 0 (1+ i))
       (count 0))
      ((= i len) count)
    (declare (fixnum i len count))
    (when (funcall pred (schar s i))
      (incf count))))

という風に前回のCOUNT-STRING-CHARが判定関数を受け取れるようになったものです。

前回に引き続いてわざわざ定義しているからには性能上のメリットでもあるんだろうかということで、速度を測ってみました。

(LOOP :REPEAT 10000000 :DO (COUNT-IF (LAMBDA (C) (CHAR= #\o C)) "fooooooooooooo"))
;⇒ NIL
----------
Evaluation took:
  2.276 seconds of real time
  2.280000 seconds of total run time (2.280000 user, 0.000000 system)
  100.18% CPU
  5,447,862,891 processor cycles
  351,152 bytes consed
  
Intel(R) Core(TM)2 Duo CPU     P8600  @ 2.40GHz

(LOOP :REPEAT 10000000 :DO (KL:COUNT-STRING-CHAR-IF (LAMBDA (C) (CHAR= #\o C)) "fooooooooooooo"))
;⇒ NIL
----------
Evaluation took:
  1.902 seconds of real time
  1.890000 seconds of total run time (1.880000 user, 0.010000 system)
  99.37% CPU
  4,553,261,946 processor cycles
  310,448 bytes consed
  
Intel(R) Core(TM)2 Duo CPU     P8600  @ 2.40GHz

今回は、そんなに違わないようです。もしかしたら、SBCLのCOUNTが遅いんじゃないかとも思えて来ました。