14:36:21 [g000030'in]
14:36:30 <g000030> 今日も Successful Lisp / David B. Lamkins ぼっち読書会やります
14:36:39 <g000030> (((Chapter 29 - I Thought it was Your Turn to Take Out the Garbage)))
14:41:45 <g000030> http://psg.com/~dlamkins/sl/chapter29.html
14:41:58 <g000030> GCの話のようです
14:42:03 <g000030> ((((What is garbage?))))
14:43:30 <g000030> まず、ごみとはなんぞやという説明ですが
14:43:35 <g000030> 簡単な
14:43:36 <g000030> (let ((x (list 1 2 3 4 5))) (print x))
14:44:04 <g000030> という例で説明しています。この場合は、xがletを抜けて利用されることはないのでゴミとして回収されることになります
14:44:45 <g000030> 脚注でreplで使う* ** *** +等の話が出ていますが、gcのモニターかなにかを確認している場合
14:45:30 <g000030> *等に過去の値が束縛されている為に回収されていなかった、というケースも稀にあります
14:46:02 <g000030> replでごちゃごちゃやっていたり、どうも変だという場合は、これらの値をnilにしたりすることがあります
14:46:33 <g000030> たまにcomp.lang.lisp等でも見受けられる質問ですね
14:46:37 <g000030> ((((Why is garbage collection important?))))
14:50:24 <g000030> なぜgcが重要なのかという話ですが、明示的にメモリを確保する場合に起きる
14:51:36 <g000030> 解放忘れのようなバグを出すことがないのがメリットとしてあげられています
14:52:36 <g000030> メモリを解放する方法がないということは、どんどんメモリが使われていってしまうことになりますが、ここでgcが使われていないメモリを解放してくれるというところです
14:52:42 <g000030> ((((How does garbage collection work?))))
14:56:21 <g000030> gcの仕組みの簡単な説明です、活きているオブジェクトが参照しているオブジェクトをルートからどんどんマークしていって、マークがないものは回収する、という説明
14:56:50 <g000030> より詳しくは、Garbage Collection: Algorithms for Automatic Dynamic Memory Management, Jones et al, 1996, Wiley, ISBN 0-471-94184-4 を参照とのこと
14:58:27 <g000030> ((((What effect does garbage have on my program?))))
15:05:27 <g000030> ゴミが及ぼす効果の説明です。
15:06:14 <g000030> 累積すると、パフォーマンスが低下することもあるとのこと
15:06:58 <g000030> 累積すると、というより、ゴミの生成→回収が激しくなると、gcが忙しくてそっちにリソースが割かれるということですね
15:08:50 <g000030> メモリ確保/解放のパフォーマンスとしては、明示的に確保/解放するC/C++と比べても、そんなに悪くなく、25-50%程度の劣化ですむのではないかとのこと。
15:09:21 <g000030> また、脚注で明示的な確保/解放についてもオーバーヘッドが皆無というわけではないという説明があります
15:10:30 <g000030> また、gcであれば先にも説明した、メモリの解放漏れや、メモリリークの心配はしなくても良いとの解説です
15:10:31 <g000030> ((((How can I reduce garbage collection pauses in my program?))))
15:12:13 <g000030> gcを採用した言語の場合でパフォーマンスチューニングする場合は、gcによる停止期間をどう減らすかという話があります
15:12:45 <g000030> (gcでの停止についてはgcの方式にもよりますが)
15:13:45 <g000030> 基本としては、適切なデータ構造で適切な操作をすること
15:14:32 <g000030> lispではリストを扱うことが多いですが、あまり考えてないプログラムは、gcを大量に稼動させることになります
15:15:41 <g000030> どこで新しくコンスされているかに注意し、既存のデータを使い回せないかに注意しようとのことです
15:17:37 <g000030> プロファイラがあるならメモリの確保がどこで活発に行なわれているかを確認すること
15:19:46 <g000030> また、既存のデータを使い回すとなると、破壊的な変更になりますが、データの破壊的変更は厄介なバグの原因になるので、良く考えて使おうとのこと
15:20:25 <g000030> ということで、29章は終わりです。次回は30章からです
15:20:32 [g000030'out] ; Quit: (quit)