我在Haskell中有一个函数,它在2个(大)浮点数列表上运行,并返回浮点数列表。我从一个简单的求和开始,现在正在寻找一个需要更长时间的更复杂的操作。那是对的 - 我真的想慢一点!
我尝试了以下内容:
listOp :: (Floating a) => [a]->[a]->[a]
listOp _ [] = []
listOp [] _ = []
listOp (x:xs) (y:ys) = (sqrt ((x/y) / (y/x))) : (listOp xs ys)
由于我的(Win32)内存限制,使用Double时列表的长度限制为400万。随机生成内容,并强制在列表上进行评估。
我需要大约5秒钟来生成每个输入列表。我尝试过各种操作来寻找昂贵的操作x+y
,x*y
,(x**y)**(y**x)
,但结果列表总是在1秒内计算(除非我的计时代码不好)。
我可以在x
和y
上使用昂贵的操作建议吗? trig函数(sin,cos等)是否是好的候选者?
感谢。
答案 0 :(得分:4)
只需迭代一些函数,如sin N次,你可以调整N,直到它足够慢。这将使FPU保持忙碌,这似乎是出于某种原因。
答案 1 :(得分:3)
一个很好的可调谐昂贵的功能是Ackermann function。 Ackermann函数的运行时间快速增加非常 - 它比指数增加得更快。
答案 2 :(得分:2)
\x y -> unsafePerformIO (threadDelay 1000000 >> return x + y)
对于CPU-y goodness,busy-loop。
loop 0 = ()
loop x = loop (x-1)
\x y -> loop 1000000000 `seq` x + y