2014-06-19-01-ファンクタの0x11対応 - 7 - project-enigma

2014-06-19-01-ファンクタの0x11対応 - 7

>> Site top >> weblog >> 月別アーカイブ >> 2014年06月のlog >> 2014-06-19-01-ファンクタの0x11対応 - 7

最終更新日付:2014/06/19 23:50:00


ファンクタの0x11対応 - 7

2014 年 06 月 19 日

さて、ファンクタの 0x11 対応という意味ではまだやることはたくさんあるのだけれど、bind マクロの話は前回でほぼ終了。今回は、相変わらず気になる性能の話。

 

相変わらず適当な上に乱暴だし、そもそもこれでやりたい計測ができているのか自分でも不安なのだが、ひとまず以下のような関数を用意した。ループ回数とファンクタを受け取り、ひたすら呼び出し続ける。ただし、毎回 functor-invoke するのではなく、functor-function で内部関数を取得するようにしている。

(locally (declare (optimize speed))
  (defun test-function (count fnc)
    (declare (type fixnum count))
    (do ((idx 0 (1+ idx))
         (closure (stl:functor-function fnc)))
        ((= idx count) nil)
      (declare (type fixnum idx))
      (declare (type function closure))
      (funcall closure (random 100)))))

 

では試してみよう。まず、基準となる lambda 式から。

(time (test-function 10000000
                     (lambda (a)
                       (funcall #'+ a 13))))
;Evaluation took:
;  0.281 seconds of real time
;  0.280802 seconds of total run time (0.280802 user, 0.000000 system)
;  100.00% CPU
;  722,074,489 processor cycles
;  0 bytes consed

 

次に、stl:binder2nd を使ってみる。

(time (test-function 10000000
                     (stl:bind2nd #'+ 13)))
;Evaluation took:
;  0.375 seconds of real time
;  0.374402 seconds of total run time (0.374402 user, 0.000000 system)
;  99.73% CPU
;  994,984,435 processor cycles
;  8,280 bytes consed

 

最後は、stl:bind マクロによるもの。

(time (test-function 10000000
                     (stl:bind #'+ :1 13)))
;Evaluation took:
;  0.343 seconds of real time
;  0.343202 seconds of total run time (0.343202 user, 0.000000 system)
;  100.00% CPU
;  895,390,831 processor cycles
;  0 bytes consed

 

上記の出力は、いずれも何度か実行してみて一番良かった数字を載せている‥‥‥が、個人的には結果に驚いている。lambda 式を使った場合よりも遅いとはいえ、それほど大きくは違わないし、bind が作るオブジェクトは binder2nd よりも速いのだ。まぁそういうこともあるだろう。自分としては、驚くほど遅くなければまぁそれでいいかな、と思っているのだが。

 

コメント

このページにコメントする

 

このページのタグ

Page tag : Common Lisp

Page tag : STLとその移植

 

 


Copyright(C) 2005-2017 project-enigma.
Generated by CL-PREFAB.