了解Haskell概要分析报告中的成本中心名称

时间:2015-02-01 00:24:21

标签: haskell

我正在尝试在Haskell配置文件输出中解码各种成本中心名称的含义。以下是.prof文件

的示例
COST CENTRE                                         MODULE   no. entries  %time %alloc   %time %alloc
  ...
  runSiT.\.\.readBufResults           SiT.SiT       3487     0    0.0      46.3   51.9   
    ...
     ...
     readBuffer.(...)                 SiT.SiT       3540     1    0.0      0.2     0.0    0.2
     readBuffer.tm0_vals              SiT.SiT       3539     1    0.0      0.0     0.0    0.0
     readBuffer.\                     SiT.SiT       3499     0   18.4     12.8    31.0   27.7
     ...

点似乎是一个点分隔嵌套的成本中心(例如readBuffer.n_threads表示n_threads内的绑定readBuffer),但我不确定其他一些元素。 .\.\.表示嵌套的lambda函数(例如来自forM_ ... $ \arg -> do之类的东西)。 但是,(...) readBuffer.(...)的含义是什么?

修改 作为第二个例子,我有:

statsFields.mkStr.\                  Main         3801           4    0.0    0.0     0.0    0.0
 statsFields.fmtModePct              Main         3811           2    0.0    0.0     0.0    0.0
  statsFields.fmtModePct.pct_str     Main         3815           2    0.0    0.0     0.0    0.0
   ssN                               SiT.SiT      3817           2    0.0    0.0     0.0    0.0
   statsFields.fmtPctI               Main         3816           2    0.0    0.0     0.0    0.0
  statsFields.fmtModePct.(...)       Main         3813           2    0.0    0.0     0.0    0.0
   ssMode                            SiT.SiT      3814           2    0.0    0.0     0.0    0.0
  statsFields.fmtModePct.m_fq        Main         3812           2    0.0    0.0     0.0    0.0

其来源是:

where ...
      fmtModePct :: SiTStats -> String
      fmtModePct ss = fmtI64 m_fq ++ " (" ++ pct_str ++ ")"
        where (m_val,m_fq) = ssMode ss
              pct_str = fmtPctI m_fq (ssN ss)

      fmtF64 :: Double -> String
      fmtF64 = commafy . printf "%.1f"

      -- turns 1000 -> 1,000
      commafy :: String -> String
      commafy str
        | head str == '-' = '-':commafy (tail str)
        | otherwise = reverse (go (reverse sig)) ++ frac
        where (sig,frac) = span (/='.') str
              go (a:b:c:cs@(_:_)) = a : b : c : ',' : go cs
              go str = str

1 个答案:

答案 0 :(得分:2)

(...)表示可重复的操作,如递归调用。在调查我的计划时,我有同样的问题。请看以下简单示例,我以递归方式评估countmergeAndCount

count :: [Int] -> (Int, [Int])
count []       = (0, [])
count (x:[])   = (0, [x])
count xs       =
  let halves  = splitAt (length xs `div` 2) xs
      (ac, a) = count $ fst halves
      (bc, b) = count $ snd halves
      (mc, merged) = mergeAndCount a b
  in
      (ac + bc + mc, merged)

mergeAndCount :: [Int] -> [Int] -> (Int, [Int])
mergeAndCount [] [] = (0, [])
mergeAndCount xs [] = (0, xs)
mergeAndCount [] ys = (0, ys)
mergeAndCount xs@(x:xs') ys@(y:ys') =
  let (larger, thisCount, (counted, merged))
        = if x < y
            then (x, 0,         mergeAndCount xs' ys)
            else (y, length xs, mergeAndCount xs ys')
  in
      (thisCount + counted, larger : merged)

将生成类似

的分析输出
    count                   Invariant               103      199999    0.1    4.3    99.2   37.5
     count.merged           Invariant               118       99998    0.0    0.0     0.0    0.0
     count.a                Invariant               113       99999    0.0    0.0     0.0    0.0
     count.b                Invariant               112       99999    0.0    0.0     0.0    0.0
     count.(...)            Invariant               110       99999    0.0    0.0    99.0   25.2
      mergeAndCount         Invariant               111     1636301   98.9   25.2    99.0   25.2
       mergeAndCount.merged Invariant               122      726644    0.0    0.0     0.0    0.0
       mergeAndCount.merged Invariant               121      709659    0.0    0.0     0.0    0.0
       mergeAndCount.(...)  Invariant               120      776644    0.0    0.0     0.0    0.0
       mergeAndCount.cnt    Invariant               119      776644    0.0    0.0     0.0    0.0
       mergeAndCount.(...)  Invariant               117      759658    0.0    0.0     0.0    0.0
       mergeAndCount.cnt    Invariant               116      759658    0.0    0.0     0.0    

其中count.merged表示总体结果,count.a count.b成本中心用于功能模式匹配。每次调用(...)时,此mergeAndCount清晰可见。

如果您的函数包含许多不同的数据处理方法,那么您的分析输出将与您发送的数据不同且高度相关。