下面的两个Haskell函数似乎不同,索引变量是隐式还是显式,但性能差异是两个数量级.
此函数大约需要0.03秒来计算mfib 30:
let mfib = (map fib [0..] !!)
where
fib 0 = 0
fib 1 = 1
fib x = mfib (x-1) + mfib (x-2)
Run Code Online (Sandbox Code Playgroud)
对于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)
Run Code Online (Sandbox Code Playgroud)
我猜它与GHC内联规则有关,并且一直在尝试添加内联/无内置编译指示以获得匹配的性能.
编辑:我理解如何查找惰性列表可以用来记忆fib函数以及为什么传统的fib定义非常慢.我期待memoization在第二个函数以及第一个函数中工作,并且不理解为什么它不是.
我需要DiffTime将time库中的a 存储在数据库(PostgreSQL)中,并且有三个选项可以转换为数据库类型:
fromIntegral . fromEnumtoRationalrealToFrac整数是精确的,但相当大,因为存储在皮秒(10 ^ 12).数值也是精确的,但计算a可能非常昂贵Rational,因为它必须计算gcd分子和分母.真实是不准确的,但也许这无关紧要.
我的时间粒度绝不会低于几分钟或大于几天.我需要做出精确的计算.速度可能不是问题.
我应该选择哪个选项以及含义是什么?在处理用户提交的数字时,一般应该避免Rational scientific吗?