2016-12-17-01-最適化とは無関係なintializer_listの変更
>> Site top >> weblog >> 月別アーカイブ >> 2016年12月のlog >> 2016-12-17-01-最適化とは無関係なintializer_listの変更
最終更新日付:2016/12/17 01:00:00
最適化とは無関係なintializer_listの変更
2016 年 12 月 17 日
昨日の失敗で少し落ち込んだけれど、ちょっと思いついたことがあるのでやってしまった。
以前書いた通り、stl:intializer_list は以下のように展開される。
#{a b c d e} => (LOCALLY (DECLARE (OPTIMIZE SPEED)) (LET ((#:ARR (MAKE-ARRAY 5))) (DECLARE (TYPE VECTOR #:ARR)) (SETF (AREF #:ARR 0) A) (SETF (AREF #:ARR 1) B) (SETF (AREF #:ARR 2) C) (SETF (AREF #:ARR 3) D) (SETF (AREF #:ARR 4) E) (MAKE-INSTANCE 'CL-STL:INITIALIZER_LIST :DATA #:ARR)))
なんでこうなっているかについては、理由があるつもりだった。make-array は、initial-contents パラメータを取ることができるが、これにはリストを渡さなければならない。状況を考えれば cl:list 関数を使う必要があるが、stl:intializer_list を make-instance するためにそのスロット変数を make-array するのに、その初期要素群を指定するためにさらにコンシングをしなければならないというのがなんとも無駄に思えたのだ。マクロ展開の時点で要素の数はわかっているのだから、マクロ展開形の中で順番に setf すればそれでいいじゃない‥‥‥という考えだった。
とはいえ、実際に計測したわけではない‥‥‥計測するべきだ。というのは昨日の失敗で思い知った。そこで比べてみた。具体的には、以下のように展開される場合との比較だ。
#{a b c d e} => (MAKE-INSTANCE 'CL-STL:INITIALIZER_LIST :DATA (MAKE-ARRAY 5 :INITIAL-CONTENTS (LIST A B C D E)))
すると、メモリ消費量には全く違いがなかった。これはどういうわけだろう? この場合に関して、cl:list 関数は実際にはコンシングをしないのだろうか? そういうこともあるかもしれない。なんらかの最適化が働いているとか、そういうことかもしれない。使っているのは sbcl だけれど、それ以外の処理系でどうなるのかはわからない。わからないけれど、とりあえずやってしまった。
コメント
このページのタグ
Page tag : STLとその移植
Page tag : Common Lisp
Copyright(C) 2005-2021 project-enigma.
Generated by CL-PREFAB.