【发布时间】:2017-05-23 15:08:59
【问题描述】:
下面的两个 Haskell 函数的区别似乎仅在于索引变量是隐式还是显式,但性能上的差异是两个数量级。
此函数计算 mfib 30 大约需要 0.03 秒:
let mfib = (map fib [0..] !!)
where
fib 0 = 0
fib 1 = 1
fib x = mfib (x-1) + mfib (x-2)
这个函数对于 mfib 30 大约需要 3 秒:
let mfib i = map fib [0..] !! i
where
fib 0 = 0
fib 1 = 1
fib x = mfib (x-1) + mfib (x-2)
我猜它与 GHC 内联规则有关,并且一直在尝试添加内联/非内联编译指示以获得匹配的性能。
编辑:我了解如何使用惰性列表查找来记忆 fib 函数以及为什么 fib 的传统定义非常慢。我期待记忆化在第二个函数和第一个函数中都能工作,但不明白为什么它不是。
【问题讨论】:
-
关键是memoization。见here。
标签: haskell optimization ghc