Compact regions
GHC 8.2から導入された新しい機能。
データを特別な領域に置くことによって、どんなにたくさんのポインタを内包していてもオブジェクト一個分のGCのコストで扱える。その代償として、中にある値を変更・削除することはできず、すべての参照の消滅をもってまとめてGCされる。
compactパッケージから利用できる。
compact :: a -> IO (Compact a)
で値をCompact regionに格納し、
getCompact :: Compact a -> a
で参照できる。
IORefなどの参照型や
関数には使えず、実行時エラーとなる。将来的には、型クラスによりコンパイル時にチェックする仕組みができるそうだが何年先の話かは不明だ。
インターフェイス自体は初心者でも扱える極めてシンプルなものだが、
GCのコストを削減するというマニアックさや
制約の重さがゆえに、あまり使われていない。
Tsuru Capitalにおいては、一秒おきに全体が更新されるような大量の数値をまとめることにより、GCの負担の軽減によるレイテンシの削減という一定の成果を収めている。
HTMLのパーサであるtagstewは、
のようなエンティティのテーブル(HashMap ShortByteString ShortByteString)をCompact regionに格納することにより、GCの時間を2割削減した。