如何确定函数是否已在Haskell中记忆?

时间:2019-01-02 10:48:49

标签: haskell memoization

我有一个Haskell程序正在明智地执行非线性性能(更糟糕的是O(n))。

我正在尝试调查某个功能是否正在进行记忆,是否可​​以验证?我熟悉GHC分析-但是我不太确定我应该看哪个值?

解决方法也只是插入一些值并观察执行时间-但这并不理想。

2 个答案:

答案 0 :(得分:0)

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

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

rightTriangles = [ (a,b,c) | 
    c <- [1..], 
    b <- [1..c], 
    a <- [1..b], 
    a^2 + b^2 == c^2]

如果您在GHCi中尝试两次以下操作,您会发现第二个调用的速度更快:

ghci > take 500 rightTriangles

答案 1 :(得分:0)

这并不是一个真正的答案,但仍然应该是有帮助的,在功能“入口”方面,记忆化似乎并不会影响输出的概况。通过以下基本示例进行演示:

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

使用上面的代码,分析输出为:

                                                                             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则会得到:

                                                                             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