5.8. 「ticky-ticky」プロファイルを使う

(ToDo: ちゃんと書く。)

ものすごい数のいろんな分かるとうれしいこと(例えば、更新の回数、データ構築子への進入の回数、などなど)を数えるようにHaskellプログラムをコンパイルすることが可能である。我々はこれを「ticky-ticky」プロファイルと呼んでいる。 これは、CPUがこれらの数を(ゆっくりと)数えているときにこういう音を発するからである。

ticky-tickyプロファイルは主に実装者向けである。通常のプロファイルシステムである「コスト集約点」式(これは全ての利用者があらゆる場合に使うように意図されている)とは大きく異なる。

ticky-tickyプロファイルを使うのに、GHCやライブラリやRTSを特別な方法でビルドする必要はない。コンパイル時の-tickyを使って、カウンタを含めてコンパイルするかどうかをモジュール単位で決めることができる。-ticky付きでコンパイルされなかったモジュールはticky-tickyプロファイルの結果に寄与しない。通常、これにはプログラムにリンクされる全てのコンパイル済みパッケージが含まれる。

プログラムにticky-tickyの数値を出力させるには、

以下に示すのは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!を挿入された状態で現れているのを確認せよ)。この出力を解析するソフトウェアは予期したカウンタが存在するか常に検査しなければならない。もう一つ注意。カウンタには大きな値をとるものがあるからね!