2010-05-11 4 views
8

GHC로 작성된 Haskell 프로그램을 프로파일 링 할 때, typeclass 함수의 이름은 .prof 파일에서 변환되어 한 인스턴스의 구현을 다른 것으로 구별합니다. 어떤 이름의 인스턴스인지 알아 내기 위해이 이름들을 어떻게 변형 할 수 있습니까?GHC 프로파일 러 출력의 기본 함수 디맹 글링

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 실행 :

예를 들어, 내가 유형 FastSlow 모두 Show을 구현하는 다음 프로그램을, 있다고 가정합니다. 생성 된 가져옵니다 .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 

을 내가 파악 할 방법 그 가 Slow의 구현이 show이고 Fast이 아닌 것입니까?

답변

8

아니요. _an9_anx 부분이 무작위로 생성됩니다. (내가 다시 컴파일 할 때 나는 _ane_anC을 얻었다.)

은 수동으로 비용 센터를 삽입 할 SCC (설정 비용 센터) 프라그를 사용할 수 있습니다

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)