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-25

KMRCLを眺める(124) COUNT-STRING-CHAR

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

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

動作は、

(KL:COUNT-STRING-CHAR "fooooooooooooo" #\o)
⇒ 13

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

定義は、

(defun count-string-char (s c)
  "Return a count of the number of times a character appears in a string"
  (declare (simple-string s)
           (character c)
           (optimize (speed 3) (safety 0)))
  (do ((len (length s))
       (i 0 (1+ i))
       (count 0))
      ((= i len) count)
    (declare (fixnum i len count))
    (when (char= (schar s i) c)
      (incf count))))

という風にそのものズバリな実装です。

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

(LOOP :REPEAT 10000000 :DO (COUNT #\o "fooooooooooooo"))
;⇒ NIL
----------
Evaluation took:
  3.537 seconds of real time
  3.510000 seconds of total run time (3.510000 user, 0.000000 system)
  [ Run times consist of 0.090 seconds GC time, and 3.420 seconds non-GC time. ]
  99.24% CPU
  8,466,477,876 processor cycles
  316,951,616 bytes consed
  
Intel(R) Core(TM)2 Duo CPU     P8600  @ 2.40GHz

(LOOP :REPEAT 10000000 :DO (KL:COUNT-STRING-CHAR "fooooooooooooo" #\o))
;⇒ NIL
----------
Evaluation took:
  0.502 seconds of real time
  0.500000 seconds of total run time (0.500000 user, 0.000000 system)
  99.60% CPU
  1,201,412,826 processor cycles
  63,440 bytes consed
  
Intel(R) Core(TM)2 Duo CPU     P8600  @ 2.40GHz

SBCLだと、ざっと7倍位、KL:COUNT-STRING-CHARの方が速いという結果がでました。