首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我如何确定一个函数是否在Haskell中被记忆?

我如何确定一个函数是否在Haskell中被记忆?
EN

Stack Overflow用户
提问于 2019-01-02 18:48:49
回答 2查看 178关注 0票数 6

我有一个Haskell程序,它的性能是非线性的(比O(n)还差)。

我正在尝试调查一个函数是否正在发生记忆,我可以验证这一点吗?我熟悉GHC分析--但我不太确定我应该查看哪些值?

EN

回答 2

Stack Overflow用户

发布于 2019-01-02 19:36:29

据我所知,在Haskell中没有自动记忆。

也就是说,GHC中似乎有一个优化,可以缓存无参数函数的值,如下所示

代码语言:javascript
运行
复制
rightTriangles = [ (a,b,c) | 
    c <- [1..], 
    b <- [1..c], 
    a <- [1..b], 
    a^2 + b^2 == c^2]

如果您在GHCi中尝试以下两次,您将看到第二次调用的速度要快得多:

代码语言:javascript
运行
复制
ghci > take 500 rightTriangles
票数 0
EN

Stack Overflow用户

发布于 2019-12-14 04:26:02

不是一个真正的答案,但仍然应该是有帮助的,就函数“条目”而言,memoization似乎不会对分析输出产生影响。通过以下基本示例进行了演示:

代码语言:javascript
运行
复制
module Main where


fib :: Int -> Int
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

fibmemo = (map fib [0 ..] !!)

main :: IO ()
main = do
  putStrLn "Begin.."
  print $ fib 10
  -- print $ fibmemo 10

使用上面的代码,性能分析输出是:

代码语言:javascript
运行
复制
                                                                             individual      inherited
COST CENTRE  MODULE                SRC                    no.     entries  %time %alloc   %time %alloc

MAIN         MAIN                  <built-in>             119          0    0.0    1.3     0.0  100.0
 CAF         Main                  <entire-module>        237          0    0.0    1.0     0.0    1.2
  main       Main                  Main.hs:(12,1)-(14,16) 238          1    0.0    0.2     0.0    0.2
   fib       Main                  Main.hs:(5,1)-(7,29)   240        177    0.0    0.0     0.0    0.0
 CAF         GHC.Conc.Signal       <entire-module>        230          0    0.0    1.2     0.0    1.2
 CAF         GHC.IO.Encoding       <entire-module>        220          0    0.0    5.4     0.0    5.4
 CAF         GHC.IO.Encoding.Iconv <entire-module>        218          0    0.0    0.4     0.0    0.4
 CAF         GHC.IO.Handle.FD      <entire-module>        210          0    0.0   67.7     0.0   67.7
 CAF         GHC.IO.Handle.Text    <entire-module>        208          0    0.0    0.2     0.0    0.2
 main        Main                  Main.hs:(12,1)-(14,16) 239          0    0.0   22.6     0.0   22.6

而如果我们注释掉fib 10并取消注释我们得到的fibmemo 10

代码语言:javascript
运行
复制
                                                                             individual      inherited
COST CENTRE  MODULE                SRC                    no.     entries  %time %alloc   %time %alloc

MAIN         MAIN                  <built-in>             119          0    0.0    1.2     0.0  100.0
 CAF         Main                  <entire-module>        237          0    0.0    1.0     0.0    2.9
  fibmemo    Main                  Main.hs:9:1-29         240          1    0.0    1.6     0.0    1.6
   fib       Main                  Main.hs:(5,1)-(7,29)   242        177    0.0    0.0     0.0    0.0
  main       Main                  Main.hs:(12,1)-(15,20) 238          1    0.0    0.2     0.0    0.2
   fibmemo   Main                  Main.hs:9:1-29         241          0    0.0    0.0     0.0    0.0
 CAF         GHC.Conc.Signal       <entire-module>        230          0    0.0    1.2     0.0    1.2
 CAF         GHC.IO.Encoding       <entire-module>        220          0    0.0    5.3     0.0    5.3
 CAF         GHC.IO.Encoding.Iconv <entire-module>        218          0    0.0    0.4     0.0    0.4
 CAF         GHC.IO.Handle.FD      <entire-module>        210          0    0.0   66.6     0.0   66.6
 CAF         GHC.IO.Handle.Text    <entire-module>        208          0    0.0    0.2     0.0    0.2
 main        Main                  Main.hs:(12,1)-(15,20) 239          0    0.0   22.2     0.0   22.2
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54004969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档