haskell-ja > Archives > 2011/04/25

2011/04/25 03:49:40 UTCkazu
#
GHC で、あるデータの実際のバイト数を調べるには、どうすればいいでしょうか? たとえば、Data.Map の Tip と Bin が 32 ビットマシンで、何バイト占めるか知りたいです。
2011/04/25 04:31:13 UTCmaoe
#
Tipが1ワードで、Binは構成子1ワード + unpackされたSize 1ワード + kへのポインタ1ワード + aへのポインタ1ワード + Mapへのポインタ1ワード x 2 = 6ワードに加えて、実際にアロケートされるkとvのサイズを加えたものになると思います。
#
1ワードは32ビットマシンなら32ビットです。
#
正式なドキュメントは知りませんが、Johan Tibellさんのビデオ http://blog.johantibell.com/2011/03/video-of-my-hashing-based-containers.html が参考になります。
#
あとはmkothaさんの http://www.kotha.net/hperf/ghc.html とか
#
unpackされた値がどうコンパイルされているかは-ddump-prepを付けてコンパイルするとよくわかります。オプションの意味はezyangさんの解説がとてもわかりやすいです。 http://blog.ezyang.com/2011/04/tracing-the-compilation-of-hello-factorial/
#
Johan Tibellさんのビデオは9分すぎあたりからちょうど同じような話をホワイトボードで解説しています。
2011/04/25 04:42:36 UTCmaoe
#
直接関係ないですが、ezyangさんによる、GHCのヒープ領域のゆるふわ解説が面白くておすすめです。 http://blog.ezyang.com/2011/04/the-haskell-heap/ http://blog.ezyang.com/2011/04/evaluation-on-the-haskell-heap/ http://blog.ezyang.com/2011/04/io-evaluates-the-haskell-heap/
2011/04/25 04:56:19 UTCkazu
#
データの基本的なレイアウトは知っているのですが、手計算ではなく、C の sizeof のように、コンパイラに計算させたいのです。
2011/04/25 04:58:07 UTCmaoe
#
なるほど。そういうツールは残念ながら知りません。
2011/04/25 05:08:35 UTCkazu
#
構成子が3つまでだと、ポインターの2ビットを使って、占有するバイト数が少なくなるそうなんですが、-ddump-prep の出力を見ても、そのことは分からないような気がします。
#
32ビットアーキテクチャでの話。
2011/04/25 05:47:24 UTCmasahiro_sakai@twitter
#
The Masahiro Sakai Daily is out! http://bit.ly/dWV46A ▸ Top stories today via
2011/04/25 06:03:54 UTCkazu
#
RWH で、リストのパターンマッチをするとき、(x:xs) を先に書いて、[] を後に書いていますね。ghc -c -ddump-stg してみると、見事に data での定義順にソートされます。リストの場合は、[] が先になります。なので、無意味ですね。
#
data で定義する構成子の順で、性能に差が出ることがあるようですね。