記録は作業の証

鉄道とコンピュータ

ゼロから作るDeep LearningをCommon Lispで書き直す(ステップ17)

ソースコード

ステップ17 メモリ管理と循環参照

弱参照を使うことで、循環参照を解消し、メモリ使用量を減らす。 循環参照があると、参照カウント方式のメモリ管理では解放が難しいという。ガベージコレクタの方式によっては循環参照になっているオブジェクトでも解放できるが、コストが高いらしい。マニュアルによればSBCL世代別GCを持っているとのことである。

Common Lispでは弱参照がANSI Common Lispの範囲にないため、処理系ごとにAPIがばらばらに定義されている。そこで、統一的に扱うためのラッパーとしてtrivial-garbageというライブラリがあるので使うことにした。 Pythonweakref.ref関数のように弱参照を作る関数はtg:make-weak-pointerである。同様に弱参照からオブジェクトを得るにはtg:weak-pointer-value関数を呼べばよい。

gist.github.com

Common Lisp標準のtimeマクロとSBCLのsb-sprofというプロファイラを使ってメモリ使用量を測ってみたところ、ステップ16とステップ17ではメモリ使用量にあまり差は出なかった。何がおかしいのだろうか?