2016-12-09-01-make_tupleにコンパイラマクロを追加 - project-enigma

2016-12-09-01-make_tupleにコンパイラマクロを追加

>> Site top >> weblog >> 月別アーカイブ >> 2016年12月のlog >> 2016-12-09-01-make_tupleにコンパイラマクロを追加

最終更新日付:2016/12/09 07:51:20


make_tupleにコンパイラマクロを追加

2016 年 12 月 09 日

ひさしぶりに CL-STL に手を入れた。あ、非順序連想コンテナのことは忘れたわけじゃないんです。

やったのは、make_tuple 関数にコンパイラマクロを追加するというもの。こいつは全てを &rest 引数で受け取るから、実行時コストがやっぱり気になってはいたんだな。しかし、ほとんどの場合においてコンパイル時点で要素数はわかるのだから、実行時コストを先払いすることは可能だと気付いたわけだ。

そんなわけでやってみた。コードは面倒なので示さないが、どれくらいの効果があったのかは示しておこう。まずは、コンパイラマクロが作用している場合。

(let ((a 0)
      (b :one)
      (c 'two)
      (d "three"))
  (time (stl:make_tuple a b c d)))

;Evaluation took:
;  0.000 seconds of real time
;  0.000000 seconds of total run time (0.000000 user, 0.000000 system)
;  100.00% CPU
;  6,846 processor cycles
;  0 bytes consed

 

次は、コンパイラマクロが作用しない場合。

(let ((fnc #'stl:make_tuple))
  (let ((a 0)
        (b :one)
        (c 'two)
        (d "three"))
    (time (funcall fnc a b c d))))

;Evaluation took:
;  0.000 seconds of real time
;  0.000000 seconds of total run time (0.000000 user, 0.000000 system)
;  100.00% CPU
;  21,974 processor cycles
;  0 bytes consed

 

ちゃんと効果はでているようだ。これを書いている途中で、stl:get もコンパイラマクロで効率化できるかもしれないと思い始めたが、ちょっと難しいかもしれない。そして、全くの別件になるが、pair 周辺でバグを見つけてしまった。これについては改めて書くとしよう。

 

コメント

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

 

このページのタグ

Page tag : STLとその移植

Page tag : Common Lisp

 

 


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