8

GHC で書かれた Haskell プログラムをプロファイリングするとき、型クラス関数の名前は .prof ファイルでマングルされ、あるインスタンスのそれらの実装を別のインスタンスと区別します。これらの名前をデマングルして、それがどのタイプのインスタンスであるかを調べるにはどうすればよいですか?

たとえば、次のプログラムがあり、型FastSlow両方が実装されているとしShowます。

import Data.List (foldl')

sum' = foldl' (+) 0

data Fast = Fast
instance Show Fast where
    show _ = show $ sum' [1 .. 10]

data Slow = Slow
instance Show Slow where
    show _ = show $ sum' [1 .. 100000000]

main = putStrLn (show Fast ++ show Slow)

でコンパイルし-prof -auto-all -caf-allて実行し+RTS -pます。生成される .prof ファイルでは、上位のコスト センターは次のとおりです。

COST CENTRE                    MODULE               %time %alloc

show_an9                       Main                  71.0   83.3
sum'                           Main                  29.0   16.7

ツリーには、同様に次のように表示されます (関係のない行は省略します)。

                                                individual    inherited
COST CENTRE       MODULE       no.    entries  %time %alloc   %time %alloc

  main            Main         232           1   0.0    0.0   100.0  100.0
   show_an9       Main         235           1  71.0   83.3   100.0  100.0
    sum'          Main         236           0  29.0   16.7    29.0   16.7
   show_anx       Main         233           1   0.0    0.0     0.0    0.0

の実装であり、の実装でshow_an9はないことをどのように把握できますか?SlowshowFast

4

1 に答える 1

8

いいえ、できません。_an9との_anx部分はランダムに生成されます。(再度コンパイルすると、 and が得_aneられ_anCます。)

SCC(set-cost-center) プラグマを使用して、手動でコスト センターを挿入できます。

data Fast = Fast
instance Show Fast where
    show _ = {-# SCC "show(Fast)" #-} show $ sum' [1 .. 10]

data Slow = Slow
instance Show Slow where
    show _ = {-# SCC "show(Slow)" #-} show $ sum' [1 .. 100000000]

プロファイルには次のように表示されます。

  main
   show_an9
    show(Slow)
     sum'
   show_anx
    show(Fast)
于 2010-05-11T10:57:02.163 に答える