gpt4 book ai didi

haskell - .prof 报告中的 .(...) 是什么意思?

转载 作者:行者123 更新时间:2023-12-02 06:01:34 26 4
gpt4 key购买 nike

我正在通过使用 -prof 编译来寻找 Haskell 程序中的优化机会,但我不知道如何解释包含省略号的成本中心。什么是 filter.(...)jankRoulette.select.(...)

COST CENTRE                MODULE                     %time %alloc

filter.(...) Forest 46.5 22.3
set-union Forest 22.5 4.1
cache-lookup Forest 16.0 0.1
removeMany MultiMapSet 3.7 1.9
insertMany MultiMapSet 3.3 1.8
jankRoulette.select.(...) Forest 1.4 15.2

我用以下命令生成:$ ghc --make -rtsopts -prof -auto-all main.hs && ./main +RTS -p && cat main.prof

函数filterwhere子句中有一些定义,如下所示:

filter a b = blahblah where
foo = bar
bar = baz
baz = bing

但这些都显示为 filter.foofilter.bar 等。

我认为它们可能是嵌套的 let 表达式,但 jankRoulette.select 没有任何表达式。我已在其中大多数指令的前面添加了 SCC 指令,而没有任何这些成本中心上升到顶部。

由于大部分时间都花在 filter.(...) 上,我想知道那是什么。 :)

最佳答案

TL; DR: 当您在 let 绑定(bind)中进行模式匹配时,GHC 会生成此内容,例如 let (x,y) = c。评估 c 的成本由 ... 成本中心跟踪(因为它没有唯一的名称)`。

<小时/>

那么我是怎么发现这一点的呢?GHC 源代码中的 (...) 的 grep 发现以下内容(来自compiler/deSugar/Coverage.hs):

-- TODO: Revisit this
addTickLHsBind (L pos (pat@(PatBind { pat_lhs = lhs, pat_rhs = rhs }))) = do
let name = "(...)"
(fvs, rhs') <- getFreeVars $ addPathEntry name $ addTickGRHSs False False rhs

{- ... more code following, but not relevant to this purpose
-}

该代码告诉我们它必须对模式绑定(bind)执行某些操作。所以我们可以制作一个小测试程序来检查行为:

x :: Int
(x:_) = reverse [1..1000000000]

main :: IO ()
main = print x

然后,我们可以在启用分析的情况下运行该程序。事实上,GHC 会生成以下输出:

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

%alloc
MAIN MAIN 42 0 0.0 0.0 100.0 100.0
CAF Main 83 0 0.0 0.0 100.0 100.0
(...) Main 86 1 100.0 100.0 100.0 100.0
x Main 85 1 0.0 0.0 0.0 0.0
main Main 84 1 0.0 0.0 0.0 0.0

事实证明,从代码中做出的假设是正确的。程序的所有时间都花在评估反向 [1..1000000000] 表达式上,并将其分配给 (...) 成本中心。

关于haskell - .prof 报告中的 .(...) 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30203566/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com