2010-05-11 12 views
8

GHC'de yazılmış bir Haskell programına profil oluştururken, bir örneklemin bir başkasının uygulamalarını birbirinden ayırt etmek için .prof dosyasında yer alan tipeclass işlevlerinin adları karıştırılır. Hangi türün örneğini bulmak için bu adları nasıl sıralayabilirim?GHC profiler çıktısındaki türetilmiş yazım fonksiyonları

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) 

Ben -prof -auto-all -caf-all ile derlemek ve +RTS -p ile çalıştırın:

Mesela ben tipleri Fast ve Slow hem Show uygulamak aşağıdaki programı, olduğunu varsayalım. oluşturulan alır .prof dosyasında, ben üst masraf olduğunu görüyoruz:

COST CENTRE     MODULE    %time %alloc 

show_an9      Main     71.0 83.3 
sum'       Main     29.0 16.7 

Ve ağaçta

, ben de aynı şekilde (ilgisiz çizgilerini ihmal) bakın:

           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 

Düşündüm yapmak nasıl 'un Slow'un show 'un uygulanması ve Fast' un değil mi?

cevap

8

Hayır yapamazsınız. _an9 ve _anx parçaları rastgele oluşturulur. (Tekrar derlemek zaman _ane ve _anC var.)

el bir maliyet merkezi eklemek için SCC (set-maliyet-merkezini) pragma kullanabilirsiniz:

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] 

profili göstermelidir:

main 
    show_an9 
    show(Slow) 
    sum' 
    show_anx 
    show(Fast)