(ToDo: ちゃんと書く。)
ものすごい数のいろんな分かるとうれしいこと(例えば、更新の回数、データ構築子への進入の回数、などなど)を数えるようにHaskellプログラムをコンパイルすることが可能である。我々はこれを「ticky-ticky」プロファイルと呼んでいる。 これは、CPUがこれらの数を(ゆっくりと)数えているときにこういう音を発するからである。
ticky-tickyプロファイルは主に実装者向けである。通常のプロファイルシステムである「コスト集約点」式(これは全ての利用者があらゆる場合に使うように意図されている)とは大きく異なる。
ticky-tickyプロファイルを使うのに、GHCやライブラリやRTSを特別な方法でビルドする必要はない。コンパイル時の-ticky
を使って、カウンタを含めてコンパイルするかどうかをモジュール単位で決めることができる。-ticky
付きでコンパイルされなかったモジュールはticky-tickyプロファイルの結果に寄与しない。通常、これにはプログラムにリンクされる全てのコンパイル済みパッケージが含まれる。
プログラムにticky-tickyの数値を出力させるには、
プログラムを-debug
付きでリンクする(リンク時においては-ticky
は-debug
の同義語である)。これによって、ticky-tickyプロファイルの結果を収集して報告するためのコードを含んだデバッグ版RTSがリンクされる。
プログラムをRTSオプション-r
を付けて実行する。4.16. コンパイル済みプログラムを実行するを見よ。
以下に示すのはticky-ticky統計ファイルの例であり、foo +RTS -rfoo.tickyというコマンドで生成されたものである。
foo +RTS -rfoo.ticky ALLOCATIONS: 3964631 (11330900 words total: 3999476 admin, 6098829 goods, 1232595 slop) total words: 2 3 4 5 6+ 69647 ( 1.8%) function values 50.0 50.0 0.0 0.0 0.0 2382937 ( 60.1%) thunks 0.0 83.9 16.1 0.0 0.0 1477218 ( 37.3%) data values 66.8 33.2 0.0 0.0 0.0 0 ( 0.0%) big tuples 2 ( 0.0%) black holes 0.0 100.0 0.0 0.0 0.0 0 ( 0.0%) prim things 34825 ( 0.9%) partial applications 0.0 0.0 0.0 100.0 0.0 2 ( 0.0%) thread state objects 0.0 0.0 0.0 0.0 100.0 Total storage-manager allocations: 3647137 (11882004 words) [551104 words lost to speculative heap-checks] STACK USAGE: ENTERS: 9400092 of which 2005772 (21.3%) direct to the entry code [the rest indirected via Node's info ptr] 1860318 ( 19.8%) thunks 3733184 ( 39.7%) data values 3149544 ( 33.5%) function values [of which 1999880 (63.5%) bypassed arg-satisfaction chk] 348140 ( 3.7%) partial applications 308906 ( 3.3%) normal indirections 0 ( 0.0%) permanent indirections RETURNS: 5870443 2137257 ( 36.4%) from entering a new constructor [the rest from entering an existing constructor] 2349219 ( 40.0%) vectored [the rest unvectored] RET_NEW: 2137257: 32.5% 46.2% 21.3% 0.0% 0.0% 0.0% 0.0% 0.0% 0.0% RET_OLD: 3733184: 2.8% 67.9% 29.3% 0.0% 0.0% 0.0% 0.0% 0.0% 0.0% RET_UNBOXED_TUP: 2: 0.0% 0.0%100.0% 0.0% 0.0% 0.0% 0.0% 0.0% 0.0% RET_VEC_RETURN : 2349219: 0.0% 0.0%100.0% 0.0% 0.0% 0.0% 0.0% 0.0% 0.0% UPDATE FRAMES: 2241725 (0 omitted from thunks) SEQ FRAMES: 1 CATCH FRAMES: 1 UPDATES: 2241725 0 ( 0.0%) data values 34827 ( 1.6%) partial applications [2 in place, 34825 allocated new space] 2206898 ( 98.4%) updates to existing heap objects (46 by squeezing) UPD_CON_IN_NEW: 0: 0 0 0 0 0 0 0 0 0 UPD_PAP_IN_NEW: 34825: 0 0 0 34825 0 0 0 0 0 NEW GEN UPDATES: 2274700 ( 99.9%) OLD GEN UPDATES: 1852 ( 0.1%) Total bytes copied during GC: 190096 ************************************************** 3647137 ALLOC_HEAP_ctr 11882004 ALLOC_HEAP_tot 69647 ALLOC_FUN_ctr 69647 ALLOC_FUN_adm 69644 ALLOC_FUN_gds 34819 ALLOC_FUN_slp 34831 ALLOC_FUN_hst_0 34816 ALLOC_FUN_hst_1 0 ALLOC_FUN_hst_2 0 ALLOC_FUN_hst_3 0 ALLOC_FUN_hst_4 2382937 ALLOC_UP_THK_ctr 0 ALLOC_SE_THK_ctr 308906 ENT_IND_ctr 0 E!NT_PERM_IND_ctr requires +RTS -Z [... たくさん省略 ...] 0 GC_SEL_ABANDONED_ctr 0 GC_SEL_MINOR_ctr 0 GC_SEL_MAJOR_ctr 0 GC_FAILED_PROMOTION_ctr 47524 GC_WORDS_COPIED_ctr
アスタリスクの行より上の部分の情報の書式は変更されるかもしれないが、人間可読な要約としては便利だろう、hopefully。アスタリスクより下にはticky-tickyシステムが管理する全ての計測結果がダンプされている。この形式は機械処理を意図したものである。零個以上のスペース、整数、一つのスペース、カウンタ名、改行。
実際には、全てのカウンタがダンプされる必要はない。コンパイル時や実行時のフラグがある種のカウンタを無効にすることがある。このような場合、そういうカウンタは現れないか、カウンタ名が変更されて(場合によっては省略原因の説明と一緒に)出現する。(上記で、ENT_PERM_IND_ctr
が!
を挿入された状態で現れているのを確認せよ)。この出力を解析するソフトウェアは予期したカウンタが存在するか常に検査しなければならない。もう一つ注意。カウンタには大きな値をとるものがあるからね!